语法

别跳过哦!
在开始这一部分之前,请先完成上一部分的练习。 它位于课程GitHub仓库中的exercises/01_intro/00_welcome
使用wr来开始课程并验证你的解决方案。

前一个任务甚至都不算是一个练习,但它已经让你接触到了不少Rust的语法。 我们不会涵盖之前练习中使用的每一个Rust语法细节。 相反,我们会涵盖足够的内容,以便继续前进而不会陷入细节中。 一步一步来!

注释

你可以使用//来编写单行注释:

#![allow(unused)]
fn main() {
// 这是一行单行注释
// 后面跟着另一行单行注释
}

函数

Rust中的函数使用fn关键字定义,后面跟着函数名称、输入参数和返回类型。 函数体用大括号{}括起来。 在前一个练习中,你看到了greeting函数:

#![allow(unused)]
fn main() {
// `fn` <function_name> ( <input parameters> ) -> <return_type> { <body> }
fn greeting() -> &'static str {
    // TODO: fix me 👇
    "I'm ready to __!"
}
}

greeting没有输入参数,返回一个字符串切片引用(&'static str)

返回类型

如果函数不返回任何值(即返回Rust的单元类型())的话,返回类型可以从签名中省略。 这就是test_welcome函数的情况:

#![allow(unused)]
fn main() {
fn test_welcome() {
    assert_eq!(greeting(), "I'm ready to learn Rust!");
}
}

上述代码等同于:

#![allow(unused)]
fn main() {
// 显式地写出单元返回类型
//                   👇
fn test_welcome() -> () {
    assert_eq!(greeting(), "I'm ready to learn Rust!");
}
}

返回值

函数中的最后一个表达式会被隐式地返回:

#![allow(unused)]
fn main() {
fn greeting() -> &'static str {
    // 这是函数中的最后一个表达式
    // 因此它的值会被`greeting`返回
    "I'm ready to learn Rust!"
}
}

你也可以使用return关键字提前返回一个值:

#![allow(unused)]
fn main() {
fn greeting() -> &'static str {
    // 注意行尾的分号!
    return "I'm ready to learn Rust!";
}
}

当可能时,省略return关键字被认为是惯用的写法。

输入参数

输入参数在函数名后面的括号()内声明。 每个参数都用其名称、一个冒号:和它的类型来声明。 例如,下面的greet函数接受一个类型为&str(字符串切片)的name参数:

#![allow(unused)]
fn main() {
// 一个输入参数
//        👇
fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}
}

如果有多个输入参数,它们必须用逗号分隔开。

类型注解

既然我们已经提到了"类型"几次,让我们明确一下:Rust是一种静态类型语言。 Rust中的每个值都有一个类型,并且该类型在编译时必须为编译器所知。

类型是一种静态分析的形式。

你可以将类型看作是编译器附加在你程序中每个值上的标签。根据这个标签,编译器可以强制执行不同的规则——例如,你不能将一个字符串加到一个数字上,但你可以将两个数字相加。

如果使用正确,类型可以防止整个类别的运行时错误。

参考资料

  • 本节的练习位于 exercises/01_intro/01_syntax