Rust如何尊重复制特性?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust如何尊重复制特性?相关的知识,希望对你有一定的参考价值。

[如果您使一个结构派生Copy特性,那么Rust将在以下代码中将y复制为x,而不是从x移至y

#[derive(Debug, Copy, Clone)]
struct Foo;

let x = Foo;

let y = x;

[如果我使用C ++,我会说Copy以某种方式使Foo实现了=运算符,其方式是在右侧复制整个对象。

在Rust中,是否只是在编译器中将其简单地实现为规则?当编译器找到let y=x时,它仅检查复制特征是否派生,并确定复制还是移动?

我对Rust内部有兴趣,因此我可以更好地理解该语言。教程中找不到此信息。

答案

是,这是直接在编译器中实现的。

它会影响本来会移动项目的任何情况,因此它还会影响将参数传递给函数或在match表达式中进行匹配-基本上是涉及模式匹配的任何情况。这样,它实际上不能与用C ++实现=运算符相提并论。

Copy特性的定义是marked as a "lang" item in the source code of the standard library。编译器知道标记为#[lang = "copy"]的项目是决定是否移动或复制类型的特征。编译器还知道一些隐式Copy类型的规则,例如仅包含Copy项的闭包或元组。

另一答案

在Rust中,是否只是在编译器中将其简单地实现为规则?当编译器找到let y = x时,它仅检查复制特征是否派生,并确定复制还是移动?

另一答案

如果要深入研究此代码的编译方式,可以查看运动场中的MIR表示形式。在这个稍微简化的版本中:

以上是关于Rust如何尊重复制特性?的主要内容,如果未能解决你的问题,请参考以下文章

你好xb 请尊重'别人的'原创

为啥 Chrome 不尊重我的内容安全政策哈希?

如何尊重原始参数的开/关原则?

如何赢得别人的尊重

如何比较人物(尊重文化)

业务逻辑发生变化时如何尊重开闭原则?