В общем, я думаю, что вы никогда не должны использовать форму &f: &Foo
. Единственная причина, по которой он принимается компилятором, заключается в том, что параметры функции (например, let
присваивание) на самом деле являются неопровержимыми образцами. Это можно увидеть в сообщении об ошибке, если вы попытаетесь ввести общий шаблон:
fn take_option (Some (f): Option<Foo>) {
println!("{:?}", f);
}
не жалуется на неверный синтаксис, а вместо этого выдает следующее сообщение об ошибке:
error[E0005]: refutable pattern in function argument: `None` not covered
--> src/main.rs:15:21
|
15 | fn take_option (Some (f): Option<Foo>) {
| ^^^^^^^^ pattern `None` not covered
Использование шаблонов в качестве аргументов функций допускает такие полезные вещи, как автоматическая кортеж, массив или деструктуризация структуры:
fn take_tuple ((x, y): (i32, i32)) {
println!("x: {}, y: {}", x, y);
}
fn take_array ([x, y]: [i32; 2]) {
println!("x: {}, y: {}", x, y);
}
fn take_foo (Foo { bar: bar }: Foo) {
println!("bar: {}", bar);
}
population
.iter()
.enumerate()
.map (|(rank, person)| { ... });