2017-01-10 10 views
1

Когда переменная опции, как известно, не- None, его обычно прекрасно пишут:Может ли синтаксис `let Some (var) = option;` использоваться в ситуации, когда известно, что это не `None`?

let var = option_var.unwrap(); 

В одном случае я столкнулся, это вызвало ошибку о переходе из заимствованного контекста.

if let Some(var) = option_var { ... } 

(Handy, так как позволяет Some(ref mut var) = option_var тоже).

Это работает, однако в этом случае я не хочу, чтобы это было заявлением if. Письмо let Some(var) = option_var; с ошибкой "шаблон None не покрыт".

Должно быть ясным Этот вопрос не о заемном контексте.

Может ли синтаксис let Some(var) = option; использоваться в ситуации, когда известно, что это не None? Разрешение «Шаблон None не покрыт» предупреждением? Или это просто не поддерживается вне заявления if?

+3

«В одном случае я столкнулся с тем, что в этом случае? – Ven

+1

Или дубликат http://stackoverflow.com/q/30463490/155423; http://stackoverflow.com/q/30365055/155423; или любой из [** 105 других ** вопросов о «не может выйти из заемного контента»] (http://stackoverflow.com/search?q=is%3Aq+%5Brust%5D+cannot+move+out+of + заимствованные). Жаль, что здесь недостаточно деталей, чтобы выбрать лучший дубликат. – Shepmaster

+0

Этот вопрос касается не заимствованного контекста, а его использования 'let Some (var) = option_var' - если это возможно вне оператора if. – ideasman42

ответ

6

Учитывая следующий случай:

fn main() { 
    let foo = Some(1); 
    let Some(bar) = foo; 
} 

ошибки [E0005]: опровержим узор в локальном связывании: None не охватывается

let Some(x) = y вводит шаблон; let и match утверждения и аргументы функции являются контекстами сопоставления шаблонов, но поскольку в этом случае шаблон не охватывает другой возможный случай, это не является допустимым контекстом сопоставления шаблонов.

Режимы let Some(x) = y применимы к выражениям if let и while let.

Если вы уверены (например, с более ранней assert!() или если он будет введен «вручную»), что None не представляется возможным, вы можете просто использовать unwrap().

+0

Re: * "но так как в этом случае шаблон не распространяется на другой возможный случай, это не действительный контекст соответствия шаблона." * - возможно ли удовлетворить это ограничение? или он * требует * использования с 'if let ... etc' при любых обстоятельствах? – ideasman42

+0

Я включил эту информацию в ответ. – ljedrz

+0

* Единственные контексты, к которым применим оператор 'let Some (x) = y', относятся к выражениям' if let' и 'while let'. * Это верно для опции« Option », но не в целом. В общем, шаблон, переданный 'let', должен быть неопровержимым. Для опции, поскольку он имеет два варианта, шаблон 'Some (_)' опровержимо, для этого требуется тестирование через 'if let'. Если мы рассмотрим перечисление только с одним вариантом, регулярный 'let Variant (_) = some_enum;' будет работать нормально. – Arnavion