首页 > 其他分享 >Rust-语句和表达式

Rust-语句和表达式

时间:2022-08-24 20:55:40浏览次数:54  
标签:语句 返回 let Rust 求值 返回值 表达式

语句和表达式

Rust 的函数体是由一系列语句组成,最后由一个表达式来返回值,例如:

fn add_with_extra(x: i32, y: i32) -> i32 {
    let x = x + 1; // 语句
    let y = y + 5; // 语句
    x + y // 表达式
}

语句会执行一些操作但是不会返回一个值,而表达式会在求值后返回一个值,因此在上述函数体的三行代码中,前两行是语句,最后一行是表达式。

对于 Rust 语言而言,这种基于语句和表达式的方式是非常重要的,你需要能明确的区分这两个概念, 但是对于很多其它语言而言,这两个往往无需区分。基于表达式是函数式语言的重要特征,表达式总要返回值

语句

let a = 8;
let b: Vec<f64> = Vec::new();
let (a, c) = ("hi", false);

以上都是语句,它们完成了一个具体的操作,但是并没有返回值,因此是语句。

由于 let 是语句,因此不能将 let 语句赋值给其它值,如下形式是错误的:

let b = (let a = 8);

错误如下:

error: expected expression, found statement (`let`) // 期望表达式,却发现`let`语句
 --> src/main.rs:2:13
  |
2 |     let b = let a = 8;
  |             ^^^^^^^^^
  |
  = note: variable declaration using `let` is a statement `let`是一条语句

error[E0658]: `let` expressions in this position are experimental
          // 下面的 `let` 用法目前是试验性的,在稳定版中尚不能使用
 --> src/main.rs:2:13
  |
2 |     let b = let a = 8;
  |             ^^^^^^^^^
  |
  = note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
  = help: you can write `matches!(<expr>, <pattern>)` instead of `let <pattern> = <expr>`

以上的错误告诉我们 let 是语句,不是表达式,因此它不返回值,也就不能给其它变量赋值。但是该错误还透漏了一个重要的信息, let 作为表达式已经是试验功能了,也许不久的将来,我们在 [stable rust](https://course.rs/appendix/rust-version.html) 下可以这样使用。

表达式

表达式会进行求值,然后返回一个值。例如 5 + 6,在求值后,返回值 11,因此它就是一条表达式。

表达式可以成为语句的一部分,例如 let y = 6 中,6 就是一个表达式,它在求值后返回一个值 6(有些反直觉,但是确实是表达式)。

调用一个函数是表达式,因为会返回一个值,调用宏也是表达式,用花括号包裹最终返回一个值的语句块也是表达式,总之,能返回值,它就是表达式:

fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}
The value of y is: 4

上面使用一个语句块表达式将值赋给 y 变量,语句块长这样:

{
    let x = 3;
    x + 1
}

该语句块是表达式的原因是:它的最后一行是表达式,返回了 x + 1 的值,注意 x + 1 不能以分号结尾,否则就会从表达式变成语句, 表达式不能包含分号。这一点非常重要,一旦你在表达式后加上分号,它就会变成一条语句,再也不会返回一个值,请牢记!

最后,表达式如果不返回任何值,会隐式地返回一个 () 。

fn main() {
    assert_eq!(ret_unit_type(), ())
}

fn ret_unit_type() {
    let x = 1;
    // if 语句块也是一个表达式,因此可以用于赋值,也可以直接返回
    if (x > 1) {

    }
}

标签:语句,返回,let,Rust,求值,返回值,表达式
From: https://www.cnblogs.com/wanna2leo/p/16621524.html

相关文章

  • API基础正则表达式8月23日
    API基础第二天:回顾:String:Strings=newString("hello");String常用方法:length():获取长度trim():去掉两边空白toUpperCase()和toLowerCase():转大写/转小写st......
  • 常用正则表达式
    常用正则表达式一、校验数字的表达式数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多......
  • Switch表达式
    1.旧的用法staticvoidMain(string[]args){Console.WriteLine(OldMethod("Add"));Console.ReadLine();}......
  • 正则表达式
    正则表达式语法普通字符对大小写字母、数字、标点符号的匹配。表达式说明[abc]匹配[]中的所有字符[^abc]匹配除了[]中的所有字符[a-c]匹配区间内的......
  • python基础——变量 数据类型 运算符 格式化 if语句复习
    拓展+复习:1.input(’'你要输入的内容')--输入2.print('你要输入的内容')--输出/打印3.注释多行,单行多行注释”“”“”“''''''#ctrl+/4.变量的定义定义变量的......
  • Java中枚举配合switch语句用法-2022新项目
    一、业务场景项目开发中经常会遇到多条件判断的情况,如果判断条件少的话使用if/elseif/else还比较好处理,如果判断条件多的话,则在使用这种语句就不太合适。如果是自定......
  • JetBrains Fleet 1.8 最新测试版功能C#,Rust开发演示与免费下载地址
     链接:https://pan.baidu.com/s/1KSBUhfeFG8KwNZVJBg9mTg?pwd=27at提取码:27at请勿用手机百度网盘下载文件会打不开JetBrainsFleet1.8最新版安装包Windows,M......
  • Linux shell for语句的使用
    [22:26:42root@libin3libin]#catlibin6rhcsarhcerhcahcialibin1hciplibin2hcielibin3[22:26:52root@libin3libin]#foriin`catlibin6`;doping-c......
  • es6 class类中可以直接写赋值语句
    -classCar{//类中考科一直接写赋值语句,如下代码的含义是:给Car的实例对象添加一个属性,名为a,值为1a=1;b}console.log(Car);letc=newCar()console.log......
  • python中的匿名函数-lambda表达式
    匿名函数"""匿名函数-没有名字的函数-用lambda表达式创建匿名函数"""使用场景"""使用场景-需要一个函数,但又不想费神去命名这个函数-通常在这个函数只......