从Rust nightly docs,我运行
let x = 5;
let y = if x == 5 { 10 } else { println!("shapoopoy"); };
用cargo build
编译后,我得到了例外:
error: if and else have incompatible types:
expected `_`,
found `()`
(expected integral variable,
found ()) [E0308]
src/main.rs:16 let y = if x == 5 { 10 } else { println!("shapoopoy"); };
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
Could not compile `hello_world`.
或许这是当晚的变化?
rustc 1.0.0-nightly (e2fa53e59 2015-03-20) (built 2015-03-21)
cargo 0.0.1-pre-nightly (e689383 2015-03-16) (built 2015-03-16)
另外,如果我在学习Rust之后计划开展一个项目,我应该坚持使用稳定的版本吗?如果我使用旧版本,我不确定如何将Rust包含在我制作的程序中。
答案 0 :(得分:2)
让我们看看你的示例代码:
let x = 5;
let y =
if x == 5 {
10
} else {
println!("shapoopoy");
};
y
的类型是什么?第一个分支解析为一些整数变量(如u8
或i32
),但第二个分支解析为println!
的返回类型,即()
。您不能将两者这些类型存储在一个空格中,因此编译器会抱怨。
两个分支都需要解析为相同的类型 - 这取决于您需要做什么。您可以不返回任何内容,并将变量设置为副作用:
let x = 5;
let y;
if x == 5 {
y = 10;
} else {
println!("shapoopoy");
}
或在两个分支中返回一个整数:
let x = 5;
let y =
if x == 5 {
10
} else {
println!("shapoopoy");
42
};
如果我使用旧版本,我不确定如何将Rust包含在我制作的程序中。
Rust是一种编译语言。如果您分发已编译的二进制文件,那么您根本不需要“包含”Rust。但是,如果您希望其他人能够贡献,您必须保留自己可以编译的版本的副本。真的,你应该选择一个稳定的版本 - 几天内1.0 beta1,或几周内1.0。这将是一个更好的决定。