先说结论
- 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中的表达式。
发表回复