官术网_书友最值得收藏!

Copying and cloning

In Chapter 1, Hello Rust!, we discussed Send, a marker trait that allows a type to be "sent" across multiple threads. Something that's similar but less complex is local moving, which commonly occurs in a program—for example, when you pass a variable into a function.

Copying and cloning, on the other hand, happen on different occasions. When a variable is assigned to another variable, the compiler will typically copy the value implicitly, which can be done safely and cheaply for stack-allocated variables.

Copy is an implicit, bitwise copy of the value of a variable. If that variable is a pointer, the memory responsibility becomes ambiguous (who takes care of freeing?) and compilation will fail. This is where Clone comes in. The trait requires an explicit implementation of the clone() function to provide an appropriate copy of the type.

Cloning is always a deep copy of a type—implemented either manually (with the Clone trait) or by using the derive macro. Then, cloning is only a matter of invoking the clone() function, an operation that is not necessarily cheap. The following snippet illustrates these two operations:

let y = 5;
let x = y; // Copy

let a = Rc::new(5);
let b = a.clone(); // Clone

The regular usage of these traits and operations is usually intuitive and there isn't much that can go wrong. Usually the compiler clearly states the need for a Copy implementation.

It's recommended to derive or implement Copy wherever possible, but be mindful of breaking changes. Adding the trait is a non-intrusive action, whereas removing the trait will potentially break other people's code.

While copying and cloning are great for providing ownership to multiple scopes, they are required when working with immutable storage.

主站蜘蛛池模板: 深水埗区| 曲阳县| 荃湾区| 含山县| 松阳县| 凌海市| 永平县| 蓝山县| 法库县| 和田县| 沂南县| 太仆寺旗| 敖汉旗| 呼图壁县| 郎溪县| 垦利县| 如皋市| 盘山县| 汝州市| 射阳县| 汉阴县| 卓尼县| 昔阳县| 民丰县| 镇远县| 达州市| 仙游县| 宁晋县| 辰溪县| 南皮县| 临泉县| 定边县| 武义县| 平昌县| 那坡县| 溧阳市| 从江县| 朔州市| 仪征市| 铁岭县| 和田县|