You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fnmain(){let n = 5;let big_n =
if n < 10 && n > -10{println!(" 数字太小,先增加 10 倍再说");10* n
}else{println!("数字太大,我们得让它减半");
n / 2};//当用if/else作为表达式用来赋值时,要注意在else结束后添加`;`println!("{} -> {}", n, big_n);}
enumMyEnum{Foo,Bar}fnmain(){letmut count = 0;let v = vec![MyEnum::Foo,MyEnum::Bar,MyEnum::Foo];for e in v {ifletMyEnum::Foo = e {
count += 1;}//这里不能交换e和MyEnum::Foo的顺序,原因如下://在 Rust 中,if let 语法用于模式匹配和解构值。在这种情况下,if let MyEnum::Foo = e 的意思是尝试将 e 解构为 MyEnum::Foo,如果成功,则执行相应的代码块。而如果写成 if let e =MyEnum::Foo,则表示将 MyEnum::Foo 解构为 e,这在语义上是不正确的,因为 MyEnum::Foo 不是一个可解构的值。}assert_eq!(count,2);}
fnmain(){let x = Some(5);let y = 10;ifletSome(_x) = x {println!("Matched");}println!("Outside: {:?}", x);}//可以运行fnmain(){let s =Some(String::from("Hello!"));ifletSome(_s) = s {println!("found a string");}println!("{:?}", s);//s失效了}
上面这两串代码的区别在于 s 是 String 类型,而 x 是一个整数 i32 类型。在 Rust 中,对于像 i32 这样的基本类型,其实现了 Copy trait,因此在使用 if let 语句时,原始变量仍然是可用的。这意味着在第一个示例中,虽然 x 变量在 if let 语句中已经被匹配并损毁了,但它仍然可以在后续代码中使用,因为这个类型可以通过复制来恢复。
对于 String 类型,它没有实现 Copy trait,因此在第二个示例中,当你使用 if let 来解构 String 变量 s 时,如果匹配成功,就会移动 s 的所有权,导致后续无法再使用 s,因为它已经在 if let 语句中被消耗掉了。
此处并不是覆盖性的问题。
在 Rust 中,vector.pop() 方法返回一个 Option<T> 类型的值,其中 T 是向量中元素的类型。当向量为空时,pop() 方法会返回 None,否则返回 Some(element),其中 element 是被弹出的元素。
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
数组(array)
[T; Length],数组的长度是类型签名的一部分,因此数组的长度必须在编译期就已知。流程控制
模式匹配
match和if let


在 Rust 中,
==是用于比较两个值是否相等的运算符,而匹配模式中的=则是用于模式匹配和变量绑定的操作符。具体来说:
==运算符用于比较两个值是否相等,如果相等则返回 true,否则返回 false。例如:a == b表示比较a和b的值是否相等。=用于模式匹配和变量绑定。在match表达式或if let表达式中,可以使用=将某个值与模式进行匹配,并将匹配成功的部分进行变量绑定。例如:if let Some(i) = o表示将o与Some(i)进行匹配,并将成功匹配的i绑定到变量上。解构Option
模式适用场景
在 Rust 中,模式匹配可以分为可驳匹配模式(irrefutable patterns)和不可驳匹配模式(refutable patterns)两种类型:
可驳匹配模式是指无论如何都能匹配成功的模式,不会导致匹配失败。在使用可驳匹配模式时,编译器总是能够保证模式匹配成功,因此不会出现编译错误。通常用于 if let、while let 和函数参数等地方。示例:
不可驳匹配模式(refutable patterns):
不可驳匹配模式是指可能会匹配失败的模式,也就是存在某些情况下无法匹配成功。在使用不可驳匹配模式时,编译器无法保证模式一定会匹配成功,因此需要处理可能的匹配失败情况,否则会导致编译错误。通常用于 match 语句中的分支和 let 语句的左侧。示例:
全模式列表
在 Rust 中,
assert!宏接受一个表达式作为参数,该表达式的值应该是布尔类型(即true或false)。当表达式的值为false时,assert!宏会触发 panic。因此,你可能会使用类似assert!(a == 1);这样的形式来断言某个条件是否成立。对于
assert!(a, 1);这种形式,这实际上是一个语法错误,因为assert!宏需要的是一个布尔表达式,而不是单独的两个参数。正确的用法应该是像上面提到的那样使用布尔表达式。如果想要断言某个值等于某个特定值,可以这样写:
assert_eq!(a, 1);这里使用了
assert_eq!宏,它用于比较两个值是否相等,如果不相等则触发 panic。像
assert!(matches!(arr,[..]));这种就是先通过matches!得到一个布尔类型的参数,然后用assert!进行断言。上面这两串代码的区别在于
s是String类型,而x是一个整数i32类型。在 Rust 中,对于像i32这样的基本类型,其实现了Copytrait,因此在使用if let语句时,原始变量仍然是可用的。这意味着在第一个示例中,虽然x变量在if let语句中已经被匹配并损毁了,但它仍然可以在后续代码中使用,因为这个类型可以通过复制来恢复。对于
String类型,它没有实现Copytrait,因此在第二个示例中,当你使用if let来解构String变量s时,如果匹配成功,就会移动s的所有权,导致后续无法再使用s,因为它已经在if let语句中被消耗掉了。此处并不是覆盖性的问题。
在 Rust 中,
vector.pop()方法返回一个Option<T>类型的值,其中T是向量中元素的类型。当向量为空时,pop()方法会返回None,否则返回Some(element),其中element是被弹出的元素。Beta Was this translation helpful? Give feedback.
All reactions