语法
别跳过哦!
在开始这一部分之前,请先完成上一部分的练习。
它位于课程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