通过if语句无法正常工作的变量绑定

时间:2015-03-22 21:53:30

标签: rust rust-cargo

从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包含在我制作的程序中。

1 个答案:

答案 0 :(得分:2)

让我们看看你的示例代码:

let x = 5;
let y =
    if x == 5 {
        10
    } else {
        println!("shapoopoy");
    };

y类型是什么?第一个分支解析为一些整数变量(如u8i32),但第二个分支解析为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。这将是一个更好的决定。