官术网_书友最值得收藏!

  • Learning Rust
  • Paul Johnson Vesa Kaihlavirta
  • 337字
  • 2021-07-02 23:07:25

What is the difference between having and not having a semicolon?

In Rust, almost everything is an expression. This means that almost everything returns a value. One exception is the variable binding statement let. In a let statement, and many others, the ending semicolon is a mandatory part of the syntax.

However, in expressions, the semicolon has a double role: it throws away a return value of the expression in addition to allowing further expressions. So if the expression is the last in a block, having a semicolon there means that the last value is thrown away, and not having a semicolon there means to return the last value.

An example should make it clear:

// 04/semicolon_block/src/main.rs
fn main() { let x = 5u32; let y = { let x_squared = x * x; let x_cube = x_squared * x; x_cube + x_squared + x }; let z = { 2 * x; }; println!("x is {:?}", x); println!("y is {:?}", y); println!("z is {:?}", z); }

We have two different uses of the semicolon. Let's look at the let y line first:

let y =  
    { 
        let x_squared = x * x; 
        let x_cube = x_squared * x; 
        x_cube + x_squared + x // no semi-colon 
    }; 

This code does the following:

  • The code within the braces is processed
  • The final line, without the semicolon, is assigned to y

Essentially, this is considered as an inline function that returns the line without the semicolon into the variable.

The second line to consider is for z:

    let z =  
    { 
        2 * x; 
    }; 

Again, the code within the braces is evaluated. In this case, the line ends with a semicolon, so the result is thrown away and the empty value () gets bound to z.

When it is executed, we will get the following results:

In the code example, the line within fn main calling recurse gives the same result with or without the semicolon, because the Rust runtime doesn't use main's return value for anything.

主站蜘蛛池模板: 金乡县| 贺州市| 璧山县| 五台县| 太仓市| 淮安市| 濮阳县| 华坪县| 蒙自县| 巴林左旗| 广东省| 平度市| 吕梁市| 酒泉市| 北碚区| 建始县| 庆城县| 中牟县| 天祝| 赫章县| 昌乐县| 类乌齐县| 合肥市| 天水市| 靖远县| 奈曼旗| 江山市| 防城港市| 新绛县| 大丰市| 开封市| 毕节市| 扶风县| 突泉县| 平潭县| 水城县| 宣武区| 天津市| 延寿县| 年辖:市辖区| 平谷区|