Что символ '@' делает в Rust?
Я забыл указать тип параметра, и сообщение об ошибке было следующим:
error: expected one of `:` or `@`, found `)`
--> src/main.rs:2:12
|
2 | fn func(arg)
| ^ expected one of `:` or `@` here
Что поднимает вопрос: что вы можете сделать с @
условное обозначение? Я не помню, чтобы читать об использовании @
символ для чего-либо. Я также немного погуглил и ничего не смог найти. Что значит @
делать?
2 ответа
Вы можете использовать @
символ для привязки шаблона к имени. Как показывает Rust Reference:
let x = 1;
match x {
e @ 1 ... 5 => println!("got a range element {}", e),
_ => println!("anything"),
}
Назначения в Rust разрешают выражения шаблонов (при условии, что они полны), и списки аргументов не являются исключением. В конкретном случае @
это не очень полезно, потому что вы уже можете назвать соответствующий параметр. Однако для полноты приведем пример, который компилируется:
enum MyEnum {
TheOnlyCase(u8),
}
fn my_fn(x @ MyEnum::TheOnlyCase(_): MyEnum) {}
The @
Символ позволяет повторно использовать переменную, содержащую значение, которое одновременно используется в шаблоне сопоставления.
Например:
enum Student {
Junior{ id: u32}
}
let me = Student::Junior{ id: 10 };
match me {
Student::Junior{ id: id_val @ 0..=10 } => println!("in range with id: {}", id_val),
Student::Junior{ id: 11..=20 } => println!("in range 11->20"),
Student::Junior{ id } => println!("outside range with id: {}", id)
}
В этом примере, привязываяid
кid_val
совпадение можно использовать вprintln!()
, иначе это будет невозможно, как показано во втором выражении соответствия.