打印hello, world!

当你启动一个新的Rust程序时,它总是有这样的代码。

fn main() {
    println!("Hello, world!");
}
  • fn的意思是函数。

  • main是启动程序的函数。

  • ()表示我们没有给函数任何变量来启动。

{}被称为代码块。这是代码所在的空间。

println!是一个,打印到控制台。一个就像一个函数,为你写代码。宏后面有一个!。我们以后会学习如何创建宏。现在,请记住,!表示它是一个宏。

为了学习;,我们将创建另一个函数。首先,在main中,我们将打印一个数字8。

fn main() {
    println!("Hello, world number {}!", 8);
}

println!中的{}的意思是 "把变量放在这里面"。这样就会打印出Hello, world number 8!

我们可以像之前一样,放更多的东西进去。

fn main() {
    println!("Hello, worlds number {} and {}!", 8, 9);
}

这将打印出 Hello, worlds number 8 and 9!

现在我们来创建函数。

fn number() -> i32 {
    8
}

fn main() {
    println!("Hello, world number {}!", number());
}

这也会打印出 Hello, world number 8!。当Rust查看number()时,它看到一个函数。这个函数:

  • 没有参数(因为它有())
  • 返回一个i32->(称为 "瘦箭")显示了函数返回的内容

函数内部只有8。因为没有;,所以这就是它返回的值。如果它有一个;,它将不会返回任何东西(它会返回一个())。如果它有 ;,Rust 不会编译通过,因为需要返回的是 i32,而 ; 返回 (),不是 i32

fn main() {
    println!("Hello, world number {}", number());
}

fn number() -> i32 {
    8;  // ⚠️
}
5 | fn number() -> i32 {
  |    ------      ^^^ expected `i32`, found `()`
  |    |
  |    implicitly returns `()` as its body has no tail or `return` expression
6 |     8;
  |      - help: consider removing this semicolon

这意味着 "你告诉我number()返回的是i32,但你加了一个;,所以它什么都不返回"。所以编译器建议去掉分号。

你也可以写return 8;,但在Rust中,正常情况下只需将;改为return即可。

当你想给一个函数赋予变量时,把它们放在()里面。你必须给它们起个名字,写上类型。

fn multiply(number_one: i32, number_two: i32) { // Two i32s will enter the function. We will call them number_one and number_two.
    let result = number_one * number_two;
    println!("{} times {} is {}", number_one, number_two, result);
}

fn main() {
    multiply(8, 9); // We can give the numbers directly
    let some_number = 10; // Or we can declare two variables
    let some_other_number = 2;
    multiply(some_number, some_other_number); // and put them in the function
}

我们也可以返回一个i32。只要把最后的分号去掉就可以了:

fn multiply(number_one: i32, number_two: i32) -> i32 {
    let result = number_one * number_two;
    println!("{} times {} is {}", number_one, number_two, result);
    result // this is the i32 that we return
}

fn main() {
    let multiply_result = multiply(8, 9); // We used multiply() to print and to give the result to multiply_result
}

声明变量和代码块

使用let声明一个变量(声明一个变量=告诉Rust创建一个变量)。

fn main() {
    let my_number = 8;
    println!("Hello, number {}", my_number);
}

变量在代码块{}内开始和结束。在这个例子中,my_number在我们调用println!之前结束,因为它在自己的代码块里面。

fn main() {
    {
        let my_number = 8; // my_number starts here
                           // my_number ends here!
    }

    println!("Hello, number {}", my_number); // ⚠️ there is no my_number and
                                             // println!() can't find it
}

你可以使用代码块来返回一个值。

fn main() {
    let my_number = {
    let second_number = 8;
        second_number + 9 // No semicolon, so the code block returns 8 + 9.
                          // It works just like a function
    };

    println!("My number is: {}", my_number);
}

如果在代码块内部添加分号,它将返回 () (无)。

fn main() {
    let my_number = {
    let second_number = 8; // declare second_number,
        second_number + 9; // add 9 to second_number
                           // but we didn't return it!
                           // second_number dies now
    };

    println!("My number is: {:?}", my_number); // my_number is ()
}

那么为什么我们要写{:?}而不是{}呢?我们现在就来谈谈这个问题。