编者注:在Rust 1.0之前问过这个问题,问题中的一些断言在Rust 1.0中不一定正确.一些答案已更新,以解决这两个版本.
我有这个结构
struct Triplet {
one: i32,
two: i32,
three: i32,
}
Run Code Online (Sandbox Code Playgroud)
如果我将它传递给函数,则会隐式复制它.现在,有时我读到某些值不可复制,因此必须移动.
是否有可能使这个结构Triplet不可复制?例如,是否有可能实现一个Triplet不可复制的特性,因此可以"移动"?
我读到某个地方必须实现Clone特征来复制那些不能隐式复制的东西,但是我从来没有读过相反的东西,那就是有一些隐式可复制的东西,并使它不可复制,以便它移动.
这甚至有意义吗?
该锈语言网站索赔移动语义的语言的特征之一.但我无法看到Rust中如何实现移动语义.
Rust box是唯一使用移动语义的地方.
let x = Box::new(5);
let y: Box<i32> = x; // x is 'moved'
Run Code Online (Sandbox Code Playgroud)
上面的Rust代码可以用C++编写
auto x = std::make_unique<int>();
auto y = std::move(x); // Note the explicit move
Run Code Online (Sandbox Code Playgroud)
据我所知(如果我错了,请纠正我),
Rust如何提供移动语义?
在Rust中,有两种可能性来引用
借用,即参考,但不允许改变参考目的地.该&运营商借用值所有权.
可变地借用,即参考改变目的地.该&mut运营商性情不定地借用一个值所有权.
首先,任何借入必须持续不超过所有者的范围.其次,您可能拥有这两种借款中的一种或另一种,但不能同时使用这两种:
- 一个或多个
&T资源的引用(),- 一个可变的引用(
&mut T).
我相信引用一个引用是创建一个指向值的指针并通过指针访问该值.如果存在更简单的等效实现,则编译器可以优化它.
但是,我不明白什么是移动的意思以及它是如何实现的.
对于实现Copy特征的类型,它意味着复制,例如通过从源分配结构成员,或者a memcpy().对于小结构或原始数据,此副本是有效的.
而对于招?
如果你想强制闭包取得它在环境中使用的值的所有权,你可以
move在参数列表之前使用关键字
我注意到我的代码不会拥有这些值的所有权。我的代码和给定示例之间的差异是:
Vecx可变而不是不可变示例 1: Rust 编程语言
fn main() {
let x = vec![1, 2, 3];
let equal_to_x = move |z| z == x;
println!("can't use x here: {:?}", x);
let y = vec![1, 2, 3];
assert!(equal_to_x(y));
}
Run Code Online (Sandbox Code Playgroud)
示例 2:我的代码
fn main() {
let mut x = 1;
let equal_to_x = move |z| z == x;
println!("can use x here: {:?}", x);
let y = 1;
assert!(equal_to_x(y));
}
Run Code Online (Sandbox Code Playgroud)
为什么示例 …