Что символ '@' делает в 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!(), иначе это будет невозможно, как показано во втором выражении соответствия.

Другие вопросы по тегам