提问人:fiveseven 提问时间:1/11/2021 最后编辑:Shepmasterfiveseven 更新时间:1/13/2021 访问量:1565
为什么赋值运算符可以在 Rust 中链接?
Why can the assignment operator be chained in Rust?
问:
Rust 有几个不能链接的运算符(例如)。==
<
但是赋值运算符可以链接。=
a = b = 10;
在本例中,将 10 分配给 ,将 unit 分配给 。b
()
a
Rust 有什么理由允许我们这样链接吗?=
我为此创建了 Clippy 问题 6576。
答:
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;
},
}
评论
a
()