10-打印 hello, world!

打印 hello, world! — Easy Rust 中文译本

译文 · 基于 Easy Rust

原文链接: https://dhghomon.github.io/easy_rust/Chapter_9.html

中文参考:kumakichi/easy_rust_chs

打印 hello, world!

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

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

  • main是启动程序的函数。

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

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

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

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

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

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

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

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

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

现在我们来创建函数。

1
2
3
4
5
6
7
fn number() -> i32 {
    8
}

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

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

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

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

1
2
3
4
5
6
7
fn main() {
    println!("Hello, world number {}", number());
}

fn number() -> i32 {
    8;  // ⚠️
}
1
2
3
4
5
6
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即可。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fn multiply(number_one: i32, number_two: i32) { // 两个 i32 会进入函数。我们叫它们 number_one 和 number_two。
    let result = number_one * number_two;
    println!("{} times {} is {}", number_one, number_two, result);
}

fn main() {
    multiply(8, 9); // 可以直接传入数字
    let some_number = 10; // 或者先声明两个变量
    let some_other_number = 2;
    multiply(some_number, some_other_number); // 再把它们传进函数
}

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

1
2
3
4
5
6
7
8
9
fn multiply(number_one: i32, number_two: i32) -> i32 {
    let result = number_one * number_two;
    println!("{} times {} is {}", number_one, number_two, result);
    result // 这就是我们返回的 i32
}

fn main() {
    let multiply_result = multiply(8, 9); // 我们用 multiply() 既打印结果,又把结果赋给 multiply_result
}

声明变量和代码块

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

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

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

1
2
3
4
5
6
7
8
9
fn main() {
    {
        let my_number = 8; // my_number 从这里开始
                           // my_number 到这里结束!
    }

    println!("Hello, number {}", my_number); // ⚠️ 没有 my_number,
                                             // println!() 找不到它
}

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

1
2
3
4
5
6
7
8
9
fn main() {
    let my_number = {
    let second_number = 8;
        second_number + 9 // 没有分号,所以代码块返回 8 + 9。
                          // 就像函数一样
    };

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fn main() {
    let my_number = {
    let second_number = 8; // 声明 second_number,
        second_number + 9; // 给 second_number 加 9
                           // 但我们没有返回它!
                           // second_number 现在销毁了
    };

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

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

最后修改 August 21, 2026: 更新 (76fc81a2e)