打印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 () }
那么为什么我们要写{:?}
而不是{}
呢?我们现在就来谈谈这个问题。