gpt4 book ai didi

rust - 语句和表达式之间的区别

转载 作者:行者123 更新时间:2023-12-05 01:28:18 25 4
gpt4 key购买 nike

我理解 Rust 中表达式和语句的概念,但是《The Rust Programming Language》一书中的一段代码让我感到困惑。

代码如下:

fn main() {
let mut counter = 0;

let result = loop {
counter += 1;

if counter == 10 {
break counter * 2;
}
};

println!("The result is {}", result);
}

result 被分配了一个表达式(否则代码将无法运行)但是 counter * 2 之后的分号让我认为这是一个语句。

作者在别处写道

Expressions do not include ending semicolons. If you add a semicolonto the end of an expression, you turn it into a statement, which willthen not return a value

有人可以为我澄清一下吗?

最佳答案

Rust 是一种面向表达式的语言。这意味着包括控制流构造在内的大多数构造都是表达式。后跟分号 ; 的表达式是一个语句,其作用是计算表达式并丢弃其结果。因此,表达式和语句之间的区别不太重要。 但是,如果您来自其他语言,一些表达方式会有所不同,有点奇怪。

break counter * 2 是一个表达式。这个表达式的类型和值是什么?这是一个发散的表达。它没有值,类型是没有值的 ! 类型。想象一下写作:

let foo = break counter * 2;

询问foo的类型是什么。不能有 break 的效果,它本质上是一个 goto,同时还返回一个值并继续循环。因此,break 表达式的类型始终是没有值的类型。一个无人居住的类型,一个没有任何值的类型,可能看起来很奇怪,但在概念上它很好。它是永不返回的函数的返回类型。这是无限循环的类型,永远无法计算出一个值。

是的,break counter * 2;是一个丢弃表达式break counter * 2值的语句,但是表达式的值不是 计数器 * 2

loop { ... } 的类型是什么?通过命令,it is the type of the expressions在循环中的任何 break 表达式中。 loop 的值必须来自 break 表达式之一。

所以,如果你添加一些类型:

fn main() {
// The type of counter is i32, because it is not
// suffixed with a different literal type, and no
// use below causes a different type to be inferred.
let mut counter: i32 = 0;

// The type of result is the type of the loop
// expression, which by definition is the type of
// the expressions passed to `break` within the
// loop. There is only one `break`, which is passed
// counter * 2, of type i32.
let result: i32 = loop {
counter += 1;

if counter == 10 {
// The type of this expression is !.
// Since a semicolon follows, the value
// is discarded, but the expression has no value.
break counter * 2;
}
};

println!("The result is {}", result);
}

关于rust - 语句和表达式之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68794302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com