2016-04-01 Обновление:
Как Руст 1.0, код должен выглядеть следующим образом:
fn call_twice<A, F>(val: A, mut f: F) -> A
where F: FnMut(A) -> A {
let tmp = f(val);
f(tmp)
}
fn main() {
fn double(x: i32) -> i32 {x + x};
println!("Res is {}", call_twice(10, double));
println!("Res is {}", call_twice(10, |x| x + x));
}
Переход к параметру закрытия, потому что закрытие является Теперь распакованным ,
Оригинал:
Насколько мне известно, вы не можете определить функции инлайн подобное.
Что вы хотите это закрытие. Следующие работы:
fn call_twice<A>(val: A, f: |A| -> A) -> A {
let tmp = f(val);
f(tmp)
}
fn main() {
fn double(x: int) -> int {x + x};
println!("Res is {}", call_twice(10i, double));
println!("Res is {}", call_twice(10i, |x| x + x));
}
Есть несколько вещей, чтобы отметить:
Функции принуждать к закрытию, но обратное не верно.
Вам необходимо сохранить результат f(val)
во временное из-за правил заимствования. Короткая версия: вам нужен уникальный доступ к закрытию, чтобы вызвать его, а средство проверки займа недостаточно велико, чтобы реализовать два вызова, независимо от их исходных позиций.
Закрытия в настоящее время заменяются закрытыми замками, поэтому это изменится в будущем, но мы пока не совсем там.
Спасибо за объяснение. Это немного странно с временной переменной, но я думаю, что это будет исправлено в более стабильной версии. –
Это, похоже, не работает с ржавчиной 1.7: https://play.rust-lang.org/?gist=ad35b80eeae1d1966944a66a75d0ad80&version=stable –
@SandeepDatta Этот ответ с 2014 года; этот код был бы недопустимым даже в Rust 1.0. Я обновил его. –