为什么赋值运算符可以在 Rust 中链接?

Why can the assignment operator be chained in Rust?

提问人:fiveseven 提问时间:1/11/2021 最后编辑:Shepmasterfiveseven 更新时间:1/13/2021 访问量:1565

问:

Rust 有几个不能链接的运算符(例如)。==<

但是赋值运算符可以链接。=

a = b = 10;

在本例中,将 10 分配给 ,将 unit 分配给 。b()a

Rust 有什么理由允许我们这样链接吗?=

我为此创建了 Clippy 问题 6576

rust 赋值运算符

评论

0赞 phuclv 1/11/2021
在 Rust 中为一行中的多个变量分配一个值?
1赞 Sven Marnach 1/11/2021
赋值是允许在表达式上下文中使用它们的表达式,例如作为匹配臂中的结果表达式。赋值可能在预期的表达式中没有任何用处——例如,在另一个赋值的右侧,或作为函数的参数。但是,在这些情况下,我没有看到任何明确禁止赋值的命令——无论如何你都会得到一个编译器错误,除非预期是 .a()
0赞 Sven Marnach 1/11/2021
我不认为这个设计决策还有更多意义——赋值是表达式似乎很有用,而且似乎没有必要在它们没有多大意义的上下文中明确禁止它们。关于语言设计决策的问题通常有点难以回答,因为我们并不总是能深入了解这个决策最初是如何做出的,特别是对于在语言设计早期做出的决策。
0赞 kmdreko 1/11/2021
请参阅原始 RFC 需要括号进行链接比较以获取动机。
0赞 Sven Marnach 1/11/2021
@kmdreko 据我所知,RFC 仅与比较运算符有关,与赋值无关。

答:

0赞 TheCoolDrop 1/11/2021 #1

Rust 中的几乎所有内容都是表达式,而不是语句。语句和表达式之间的主要区别在于表达式在执行后返回一个值。

这也适用于赋值操作,这些操作在 Rust 中被视为表达式。赋值表达式具有返回值,也称为单位值。这对您的计划有什么影响?()

这意味着您的作业

a = b = 10

解析为

a = (b = 10)

请注意,的返回值是(因为它是一个表达式),因此此返回值被赋给 。b = 10()a

评论

0赞 fiveseven 1/11/2021
运算符是右关联的事实对我来说没有意义。如果不是正确的关联,有什么问题吗?==
0赞 TheCoolDrop 1/11/2021
如果你从左到右看,基本上你试图给某物赋值,那个东西是一个表达式,所以你评估它(实际上赋值给 b),然后你赋值表达式。a
0赞 phuclv 1/14/2021
@fiveseven如果是左关联的,那么将被解析为零意义=a = b = c = 10((a = b) = c) =10
0赞 fiveseven 1/16/2021
我说的不是右联想或左联想,而是联想或不联想。
0赞 phuclv 1/18/2021
@fiveseven这怎么行得通呢?如何对具有相同优先级的多个运算符进行分组。=(赋值)是右关联的示例
0赞 cambunctious 1/13/2021 #2

这是我能想到的一个原因。在某些情况下,将赋值作为表达式可以更简化语法。

match x {
    Some(b) => a = b,
    None => a = 1,
}

否则,上述内容必须写成:

match x {
    Some(b) => {
        a = b;
    },
    None => {
        a = 1;
    },
}