Uczę się teraz Rust i wydaje mi się, że nie mogę określić zamknięcia jako parametru funkcji. Oto co mam:Nie można przekazać zamknięcia jako parametru
fn foo(a: i32, f: |i32| -> i32) -> i32 {
f(a)
}
fn main() {
let bar = foo(5, |x| { x + 1 });
println!("{}", bar);
}
pojawia się następujący błąd:
foo.rs:1:19: 1:20 error: expected type, found `|`
foo.rs:1 fn foo(a: i32, f: |i32| -> i32) -> i32 {
Ok, więc to nie podoba składni zamknięcia. To jest trochę denerwujące, ponieważ teraz muszę to napisać:
fn foo(a: i32, f: Box<Fn(i32) -> i32>) -> i32 {
f(a)
}
fn main() {
let bar = foo(5, Box::new(|x| { x + 1 }));
println!("{}", bar);
}
Co się dzieje? Czytałem w kilku różnych places, że pierwszy przykład jest poprawny, podobnie jak usunięto składnię "typu zamknięcia", czy też robię coś nie tak?
[RFC 114] (https://github.com/rust-lang/rfcs/blob/master/text/0114-closures.md) jest bardziej odpowiedni dla tej zmiany niż RFC 231, ale szczegóły RFC 114 nie są aktualne (na przykład 'Fn' to teraz' FnMut', a 'FnShare' to teraz' Fn'). –
* jawnie oznacz je jako przestarzałe * - lub po prostu poproś drugiego rozmówcę, aby zaktualizował odpowiedź^_ ^. Zrobiłem to i zostało zaktualizowane za kilka minut. Teraz, czy to pytanie powinno zostać oznaczone jako duplikat? – Shepmaster
Nie miałem na myśli, ale raczej wpisów na blogu, gdzie treść nie jest aktualizowana przez społeczność. Może to być nawet niepożądane; na przykład posty na blogu Niko Matsakisa dotyczą raczej procesu myślowego - zachowałbyś go raczej jako odniesienie historyczne niż aktualny dokument. – mdup