Нет, такого способа нет, потому что proc() - это такой вид замыкания, который может быть вызван только один раз. Если вам нужно вызвать замыкание много раз, то вам понадобится обычное замыкание: || -> int:
fn r(p: || -> int) -> (int, int) {
(p(), p())
}
Эти замыкания, однако, привязаны к текущему стекфрейму, поэтому их нельзя возвращать из функций. Сейчас в языке есть unboxed-замыкания, которые в итоге заменят || и proc(), но пока они немного бажные. Ваш пример с их использованием перепишется так:
#![feature(unboxed_closures, overloaded_calls)]
fn r<F: FnMut() -> int>(mut p: F) -> (int, int) {
(p(), p())
}
fn main() {
println!("{}", r(|&mut:| 1))
}
А возвращать такие замыкания можно, явно забоксив их в трейт-объект:
fn make_adder(i: int) -> Box<FnMut(int) -> int> {
box |&mut: j: int| i + j
}
Unboxed-замыкания, правда, немного бажные сейчас, но к версии 1.0 языка они должны полностью работать и заменить существующие замыкания.