Rust的坑(一)
@ wgjak47 | 星期日,八月 4 日,2019 年 | 2 分钟阅读 | 更新于 星期日,八月 4 日,2019 年

记录学习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又跪了,又重装了一编,结果发现编译是木有问题的

rust
保存为图片