白话Rust1~报之以琼瑶:语句和表达式

先说结论

  • rust是一门基于表达式(expression)的语言,区别于针对语句(statement)的语言。
  • 投之以木桃,报之以琼瑶。基于表达式的语言,各种语句总是会返回执行结果。
  • 表达式语言的优点在于可组合,容易写复杂的逻辑。

什么是基于表达式的语言

rust是一门基于表达式(expression)的语言。

怎么理解基于表达式呢?想想我们生活中对别人说话的时候,总是有两种情形。

一种情形,就是下达不容反驳的霸气指令:二营长!你他娘的意大利炮呢?给我拉来!

这中情况下,下达的指令你希望需要无脑执行,不需要对方有反馈,执行的结果由命令发起者自主判断和控制。

体现在计算机语言中,就是基于statement的语言。比如go语言就是一种基于statement的语言。

下面是一个go语言的if代码段。很显然,if执行指令时就是无情的statement,if语句执行完了就结束,不会有返回结果。

var x int
if someCondition {
    x = 5
} else {
    x = 6
}

与霸气指令对应的另一种场景,则是悱恻缠绵,比如你问梦中情人一句:”在干吗呢?”,后面你期待的是什么呢,当然是一个炽热浓烈的回应了,如果对方杳无音信,你多半得辗转反侧了。

基于表达式的语言就是这个道理,几乎所有语句,都会有返回值,包括if语句。

在下面rust中,if代码块执行完了之后,会返回一个5或者6的值,该值可以赋值给变量x。

let x = if some_condition {
    5
} else {
    6
};

if语句也能返回结果?相信很多从c, golang,java等语言转过来的小伙伴,都不敢相信自己的眼睛吧。

而这就是表达式语言的特性。像不像古诗里的:投之以木桃,报之以琼瑶?只要你调用语句,就会有返回值。

基于表达式的语言中,几乎所有语言构造都是表达式,包括赋值语句、条件语句、循环语句等等,它们都可以被看做是一个表达式的值。表达式是由运算符、操作数、函数调用等组成的计算单元,而这些表达式可以通过嵌套、组合形成更复杂的表达式,最终形成程序的逻辑结构。

与基于语句的语言不同,基于表达式的语言的每一条语句都有一个返回值,这个返回值可以被赋值给变量,或者用于其他表达式的计算。由于所有语句都是表达式,这种语言通常具有简洁、清晰、可组合、高效等优点,使得代码更加易于理解和维护。

Rust、Kotlin、Scala、F#等编程语言都是基于表达式的语言,而C、C++、Java等编程语言则是基于语句的语言。

表达式语言的优点

表达式语言有什么好处呢?我认为最核心的好处,是可以把多个表达式组合起来,实现复杂的逻辑,比如以下代码:

let x = vec![1, 2, 3, 4, 5];
let y = x.iter()
         .filter(|&n| n % 2 == 0)
         .map(|n| n * n)
         .collect::<Vec<_>>();

一行代码就可以把filter, map, collect多个表达式轻松的组合在一起。看起来简洁、高效。似乎。。对数学家更友好了?

rust中的表达式

rust虽然是基于表达式的语言,但语法中也必不可少的包括statement,毕竟不是所有指令都要求返回值,比如赋值语句,就是单纯的statement。rust中如何区分statement和expression呢,简单而言,有分号结尾的就是statement,没有分号结尾的就是表达式。比如:

let x = 3;//statement
3+4;//statement
3+4 //expression

表达式往往用在代码段的末尾,也就是大括号的末尾,用来表示代码段的返回值,比如下面大括号的代码段,返回44。

{
  println!("hello");
  println!("world");
  44    
};

事实上,在一个大括号包围的代码块最后,即使你不加expression表达式,rust也会自动给你返回一个空的元祖:()

比如:

fn main(){
  println!("hello world");
}

等同于:

fn main(){
  println!("hello world");
  ()
}

报之以琼瑶,这就是rust中的表达式。



发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About Me

一位程序员,会弹吉他,喜欢读诗。
有一颗感恩的心,一位美丽的妻子,两个可爱的女儿
mail: geraldlee0825@gmail.com
github: https://github.com/lisuxiaoqi
medium: https://medium.com/@geraldlee0825