Rust 如何";改为;如果让表达?
在Rust中,在展开时可以使用Rust 如何";改为;如果让表达?,rust,syntax,pattern-matching,Rust,Syntax,Pattern Matching,在Rust中,在展开时可以使用if let而不是match,直接使用一个简单的值 所以不是 match opt\u val{ 一些(x)=>{ 用(x)做某事; } _ => {} } 我应该如何阅读或处理这些代码?对于match,这很简单:“如果opt_val与Some(x)匹配,则使用x执行…” 对于if-let我总是觉得这是一种错误的方法:“如果某些(x)匹配(?)opt_val,那么就这样做吧……”。注意,这个句子中没有let 这没什么大不了的,但我还是在这个问题上跌跌撞撞 我真的
if let
而不是match
,直接使用一个简单的值
所以不是
match opt\u val{
一些(x)=>{
用(x)做某事;
}
_ => {}
}
我应该如何阅读或处理这些代码?对于match
,这很简单:“如果opt_val
与Some(x)
匹配,则使用x
执行…”
对于if-let
我总是觉得这是一种错误的方法:“如果某些(x)
匹配(?)opt_val
,那么就这样做吧……”。注意,这个句子中没有let
这没什么大不了的,但我还是在这个问题上跌跌撞撞
我真的很喜欢被接受的答案中的“如果这让绑定成功,那么……”,因为我认为它设置了正确的焦点。把太多精力放在模式匹配上首先让我陷入了这个“问题”。
作为参考,Rust book中讨论了(ir)可反驳性和
let
。您不应该期望任何编程语言语法中的关键字直接映射到英语或任何其他自然语言中的单词
让Rust中的表达式始终接受一个模式,该模式允许您执行以下操作:
let foo = (1, (2, 3));
let (a, (b, _)) = foo;
然而,只有当模式是无可辩驳的,即它总是匹配时,这才有效
if let
扩展此功能以适应可能不总是匹配的类型
您阅读它的方式很好:“如果模式匹配,那么…”,或者“如果此let绑定成功,那么…”。左侧是模式,右侧是与模式匹配的对象。模式描述对象的结构,但不是描述整个结构,而是用自己的名称(标识符)替换某些部分。因此,您希望匹配(或者我可以说撕裂)对象optVal
,并将名称x
匹配到选项的内部,但只有在选项是Some
的情况下,如果您的对象是一个由3个选项组成的元组,您可以像这样匹配对象let(Some(x),None,j)=obj
,所以你说你把元组分成3部分,从第一部分开始你提取Some
的内容并保存在x
中,第二部分你要求它是None
,最后一部分可以是任何东西,“如果Some(x)匹配optval”实际上一点也不坏。在阅读中可以省略let
,但要理解它们,就要像往常一样引入变量绑定。如果语言想要变得更流行(cf Perl,APL…),就应该合理地将它们的关键字映射到英语。我认为,让
很好地映射到那里。
let foo = (1, (2, 3));
let (a, (b, _)) = foo;