一 函数
rust以fn
为关键字声明一个函数。函数命名规范为全小写,以下划线为分隔的单词。
1
2
3
fn main() {
}
带参数的函数
多个参数以逗号分隔,函数参数必须指定数据类型
1
2
3
fn test(x: i32, y: u64)() {
...
}
函数体内的语句与表达式
函数体由一系列的以表达式结尾的语句组成。到目前为止我们只涉及了没有表达式结尾的函数,但是能看出表达式是语句的一部分。因为rust是一种基于表达式的语言,这是一个需要理解的重大区别。其他语言在语句与表达式上并没有这样的区别。下面来探讨什么是rust语句和表达式,以及它们的不同是怎样影响函数体的。
语句是执行某些动作且无返回值的指令集。表达式是有返回值的。
使用let关键字创建一个新的变量并赋值,是一条语句。let x = 6;
是一条语句。因为语句没有返回值,所以rust不能像C/Ruby那样可以多重赋值,let x = (let y = 6);
这样的句法在rust中是错误的。
函数定义也是语句。
1
2
3
fn main() {
let y = 6;
}
这是一个只包含一条语句的main函数,而它整个自身也是一个语句。
除了语句,表达式求值构成了我们将在rust编写的剩余的大部分代码。函数调用、宏调用、数学运算,以及 {} 构成的代码域等都是表达式。表达式可以是组成语句的一部分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fn main() {
let x = 5;
let y = {
let x = 3;
// Note this line without a semicolon at the end,
// if you add a semicolon to the end of an expression,
// you turn it into a statment, which will then not return a value.
x + 1
};
println!("The value of y is: {}", y);
}
以上例子, let x = 5;
是一条语句, 5是一个表达式, 它求值5并返回给了赋值语句。
let y = { ... };
整体是一个语句, 但是 { ... }
是一个求值表达式, 它返回值给y赋值。
x + 1
是一个求值表达式,它返回值给了 {}
表达式。 注意 X + 1
结尾没有分号。因为;
是一条语句结束的完整标志。如果表达式x + 1
的结尾添加了分号,那它就变成了一个语句,而语句是没有返回值的。
有返回值的函数
函数在调用时可以返回值,rust可以不显式的命名返回值,但必须以 ->
声明返回值的类型, 在rust中,函数返回值与函数体中最后一个表达式的返回值是同义的。
1
2
3
fn five() -> i32 {
5
}
如上例, 函数体内既没有语句,调用,甚至let声明,但它是一个完整的函数。
二 注释
rust的注释使用 双斜杠 //
。 可单行,可在行代码结尾后使用
三 控制流程
if 表达式
- if 表达式的条件必须是bool值。 rust不会自动的将非布尔值转换成布尔值,所以if表达式 必须要明确返回布尔类型的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
fn main() { let number = 3; if number { println!("number is three"); } } error[E0308]: mismatched types --> src/main.rs:4:8 | 4 | if number { | ^^^^^êxpected bool, found integral variable | = note: expected type `bool` found type `{integer}`
上例,number是一个整型, rust不会像其他语言一样, 在if表达式中转成bool。
- 处理多个条件时使用 else if
1 2 3 4 5 6 7 8 9 10 11 12 13 14
fn main() { let number = 6; if number % 4 == 0 { println!("number is divisible by 4"); } else if number % 3 == 0 { println!("number is divisible by 3"); } else if number % 2 == 0 { println!("number is divisible by 2"); } else { println!("number is not divisible by 4, 3, or 2"); } }
- 在
let
语句中使用if表达式1 2 3 4 5 6 7 8 9 10
fn main() { let condition = true; let number = if condition { 5 } else { 6 }; // Note ; println!("The value of number is {}", number); }
在
let
语句中使用if else
时要注意,if 和else的代码块返回的值得类型要一致,不然解释器会报错。其实这很好理解,let
语句是用来给变量赋值的,此时if else 返回的值的不确定性是有潜在的风险的, 所有它们的类型必须一致,才能保证安全性。
loops循环
-
loop关键字会一直循环loop块内的代码,除非遇到break或ctrl C 中断
-
带条件的循环 while
-
for 循环, for… in … 用法与Python类型
1 2 3 4 5 6 7
fn main() { let a = [1,2,3,4,5,6]; for element in a.iter() { println!("the value is: {}", element); } }
四 words, statements and translation
-
concrete values 具体值 concrete n.具体物, adj.具体的,有形的,混凝土的 , vt. 使凝固
-
deliberate decision 深思熟虑的决定 deliberate adj. 深思熟虑的, 仔细考虑的, 故意的 vt. 仔细考虑,商议
-
function bodies are made up of a series of statements optionally ending in an expression. 函数体由一系列以表达式结尾的可选语句组成。
- So far, we’ve only covered functions without an ending expression, but you have seen an expression as part of a statement. Because Rust is an expression based language, this is an important distinction to understand.
到目前为止,我们只讨论了没有结束表达式的函数,但是您已经看到了表达式作为语句的一部分。因为Rust是一种基于表达的语言,这是一个需要理解的重要区别。
1 2
distinction 区别 covered 覆盖到,涉及到,讨论到
-
the entire preceding example is a statement in itself. 前面的整个例子本身就是一条语句。
-
Expressions evaluate to something and make up most of the rest of the code that you’ll write in Rust 表达式求值为某个值,并构成您将在Rust中编写的大部分代码
- prone 倾向 concise简洁的