在rust中,我们在一开始学习rust时,就被告诉,在函数结尾可以不用写return,只需要结尾的那个语句别写分号(;),那么结尾的这个语句计算的值将会作为这个函数的返回值返回。
#[test]
fn test_return_2() {
println!("none semi: {}", none_semicolon());
}
fn none_semicolon() -> String {
String::from("hello world")
}
正常输出
running 1 test
none semi: hello world
test test_return_2 ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
这时,我形成一个印象,“结尾语句不加分号,可以当return用”。还有如下的例子
fn test_return_1() -> bool {
let x = Option::Some(true);
let y = match x {
Some(val) => {
println!("{:?}", val);
val
}
None => false,
};
println!("will finish function, y: {:?}", y);
false
}
我可以看到y
变量是bool
类型,这时候我以为val这句没有加分号,所以它将值返回给语句块,从而赋值给y,但是,这时候,我改为下面这样的
#[test]
fn test_return_2() {
println!("none semi: {}", test_return_1());
}
fn test_return_1() -> bool {
let x = Option::Some(true);
let y = match x {
Some(val) => {
println!("{:?}", val);
return val;
}
None => false,
};
println!("will finish function, y: {:?}", y);
false
}
我发现,return 处就结束了函数并返回。后续的println并没有执行。
running 1 test
true
none semi: true
test test_return_2 ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
总结,位于语句块或者函数体结尾无分号结尾的语句,并不等同于return
,它处于语句块结尾时,代表将它的值赋值给语句块所代表的变量,处于函数体结尾时,代表将它的值赋值给函数体所代表的变量(函数返回变量);而return
这个函数终止返回的指令,从来都跟无分号结尾的语句无关,而是函数体的反花括号 (}) 的出现所带来的行为。