我想知道为什么比较有效if
但不使用match
.
这并不是那么多关于if
以及更多,因为您已经使用过==
在条件下。条件在一个if
语句是任何类型的表达式bool
;你只是碰巧选择了使用==
there.
The ==
运算符实际上是一个与the PartialEq trait https://doc.rust-lang.org/std/cmp/trait.PartialEq.html。此特征可以应用于任何pair的类型。并且,为了方便起见,String
有实现PartialEq<str>
and PartialEq<&str>
等 - 反之亦然。
另一方面,match
表达式使用模式匹配 https://doc.rust-lang.org/1.2.0/book/patterns.html为了比较,不==
. A &'static str
字面上的,比如"holla!"
,是一个有效的模式,但它永远不能匹配String
,这是一个完全不同的类型。
模式匹配可以让您简洁地比较复杂结构的各个部分,即使整个结构不相等,也可以将变量绑定到匹配的各个部分。尽管String
s 并没有真正从中受益,它对于其他类型来说非常强大,并且具有与==
.
请注意,您可以使用模式匹配if
通过改为使用if let
构造。你的例子看起来像这样:
if let "holla!" = &*s {
println!("it worked!");
}
相反,一种使用方法==
里面一个match
是这样的:
match s {
_ if s == "holla!" => println!("it worked!"),
_ => println!("nothing"),
}
或者,正如@ljedrz 所建议的:
match s == "holla!" {
true => println!("it worked!"),
_ => println!("nothing")
}