Rust学习四 rust的函数、注释与控制流

Posted by rpl on March 12, 2020

通过此链接查看rust学习系列的其他文章

一 函数

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 表达式

  1. 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。

  2. 处理多个条件时使用 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");
        }
    }
       
    
  3. 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循环

  1. loop关键字会一直循环loop块内的代码,除非遇到break或ctrl C 中断

  2. 带条件的循环 while

  3. 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

  1. concrete values 具体值 concrete n.具体物, adj.具体的,有形的,混凝土的 , vt. 使凝固

  2. deliberate decision 深思熟虑的决定 deliberate adj. 深思熟虑的, 仔细考虑的, 故意的 vt. 仔细考虑,商议

  3. function bodies are made up of a series of statements optionally ending in an expression. 函数体由一系列以表达式结尾的可选语句组成。

  4. 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 覆盖到,涉及到,讨论到
    
  5. the entire preceding example is a statement in itself. 前面的整个例子本身就是一条语句。

  6. Expressions evaluate to something and make up most of the rest of the code that you’ll write in Rust 表达式求值为某个值,并构成您将在Rust中编写的大部分代码

  7. prone 倾向 concise简洁的