函数、注释与控制流
一 函数
rust以fn
为关键字声明一个函数。函数命名规范为全小写,以下划线为分隔的单词。
fn main() {
}
带参数的函数
多个参数以逗号分隔,函数参数必须指定数据类型
fn test(x: i32, y: u64)() {
...
}
函数体内的语句与表达式
函数体由一系列的以表达式结尾的语句组成。到目前为止我们只涉及了没有表达式结尾的函数,但是能看出表达式是语句的一部分。因为rust是一种基于表达式的语言,这是一个需要理解的重大区别。其他语言在语句与表达式上并没有这样的区别。下面来探讨什么是rust语句和表达式,以及它们的不同是怎样影响函数体的。
语句是执行某些动作且无返回值的指令集。表达式是有返回值的。
使用let关键字创建一个新的变量并赋值,是一条语句。let x = 6;
是一条语句。因为语句没有返回值,所以rust不能像C/Ruby那样可以多重赋值,let x = (let y = 6);
这样的句法在rust中是错误的。
函数定义也是语句。
fn main() {
let y = 6;
}
这是一个只包含一条语句的main函数,而它整个自身也是一个语句。
除了语句,表达式求值构成了我们将在rust编写的剩余的大部分代码。函数调用、宏调用、数学运算,以及 {} 构成的代码域等都是表达式。表达式可以是组成语句的一部分。
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中,函数返回值与函数体中最后一个表达式的返回值是同义的。
fn five() -> i32 {
5
}
如上例, 函数体内既没有语句,调用,甚至let声明,但它是一个完整的函数。
二 注释
rust的注释使用 双斜杠 //
。 可单行,可在行代码结尾后使用
三 控制流程
if 表达式
- if 表达式的条件必须是bool值。 rust不会自动的将非布尔值转换成布尔值,所以if表达式 必须要明确返回布尔类型的值。
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
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表达式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类型
fn main() { let a = [1,2,3,4,5,6]; for element in a.iter() { println!("the value is: {}", element); } }