语法 (syntax)

不要跳过!
请先完成上一部分的练习再开始这一部分。
练习位于课程GitHub仓库中的 exercises/01_intro/00_welcome 目录。
使用wr来开始课程并验证你的解决方案。

前面的任务甚至算不上一个练习,但它已经让你接触到了不少Rust的语法 (syntax)。 我们不会涵盖前面练习中使用的Rust语法的每一个细节。 相反,我们将覆盖_恰好够用_的内容来让我们继续前进,而不会陷入细节中。
一步一步来!

注释 (comments)

你可以使用 // 来写单行注释 (single-line comments):

// 这是一个单行注释
// 后面跟着另一个单行注释

函数 (functions)

Rust中的函数 (function) 使用fn关键字 (keyword) 定义,后跟函数名、输入参数 (input parameters) 和返回类型 (return type)。 函数体 (function body) 包含在大括号 (braces) {}中。

在前面的练习中,你看到了greeting函数:

// `fn` <函数名> ( <输入参数> ) -> <返回类型> { <函数体> }
// `fn` <function_name> ( <input_params> ) -> <return_type> { <body> }
fn greeting() -> &'static str {
    // TODO: 修复我 👇
    "I'm ready to __!"
}

greeting函数没有输入参数,并返回一个字符串切片 (string slice) 的引用 (reference) (&'static str)。

返回类型 (return type)

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

fn test_welcome() {
    assert_eq!(greeting(), "I'm ready to learn Rust!");
}

上面的代码等价于:

// 显式指明单元返回类型
//                   👇
fn test_welcome() -> () {
    assert_eq!(greeting(), "I'm ready to learn Rust!");
}

返回值 (returning values)

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

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

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

fn greeting() -> &'static str {
    // 注意行末的分号!
    return "I'm ready to learn Rust!";
}

在可能的情况下省略return关键字被认为是符合惯例的 (idiomatic)。

输入参数 (input parameters)

输入参数在函数名后的圆括号()内声明。
每个参数的声明格式为:参数名,后跟冒号:,然后是其类型。

例如,下面的greet函数接受一个类型为&str("字符串切片 (string slice)")的name参数:

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

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

类型标注 (type annotations)

既然我们已经多次提到了"类型 (types)",让我们明确说明:Rust是一种静态类型语言 (statically typed language)
Rust中的每个值都有一个类型,并且该类型必须在编译时(compile-time)被编译器(compiler)所知。

类型是一种静态分析 (static analysis)形式。
你可以将类型看作是编译器 (compiler) 附加到程序中每个值的
标签 (tag)
。根据不同的标签,编译器 (compiler) 可以执行不同的规则——例如,你不能将字符串加到数字上,但你可以将两个数字相加。 如果正确利用,类型可以防止整类运行时错误 (runtime bugs)。


原文链接:英文原文