记录学习rust过程中的一些坑。
Rust的一些小坑
其实也算不上rust的坑,如果是对rust的概念理解不够深入,缺失会一时半会转不过弯。
if as expressions
rust中的语句分为statement(声明)和expressions(表达式), 其中表达式经常会用来代替return
语句来实现更能简单的表达,例如在rust中:
fn test(x: u32) -> u32 {
return x+1
}
可以直接写成:
fn test(x: u32) -> u32 {
x+1
}
但是在你在别的语言这样写,例如Python:
def test(x) {
if x == 10:
return x
print("haha")
return x+1
}
切换到rust:
fn test(x: u32) -> u32 {
if x == 10 {
x
}
println!("haha");
x+1
}
会出现如下错误:
error[E0308]: mismatched types
--> src/main.rs:5:9
|
5 | x
| ^ expected (), found u32
|
= note: expected type `()`
found type `u32`
error: aborting due to previous error
但是如果你这样写就是正常的:
fn test(x: u32) -> u32 {
if x == 10 {
return x
}
println!("haha");
x+1
}
为啥呢?因为一个完整的if的表达式是这个样子的:
if x==1 {
x
} else {
x+1
}
如果else那里省略,则默认为返回类型为(),上面那种错误写法造成了类型不匹配。 举另一个例子就很好理解了:
let x: u32 = 10
let test = if x==1 {
x
} else {
x+1
}
如果这里没有else的话,test在x!=1的情况下默认值应该是啥呢,rust这里设置为了()
类型。(我猜如果是设计Go语言的那批人,会自动把这个设置为对应类型的0
值。
return 也是expression
在rust中,return也是表达式,所以其实你写return
的时候不加分号也是可以的:
fn test1(x: u32) -> u32 {
return x;
}
fn test2(x: u32) -> u32 {
return x
}
其实break
,continue
也一样,他们的求值都是`!**,即never type。只不过return有设置返回值的副作用。当然,大部分人出于习惯,还是会加分号的,那这个东西坑在那里呢?
我以为我的lsp又跪了,又重装了一编,结果发现编译是木有问题的