相关疑难解决方法(0)

是否可以使类型只能移动而不能复制?

编者注:在Rust 1.0之前问过这个问题,问题中的一些断言在Rust 1.0中不一定正确.一些答案已更新,以解决这两个版本.

我有这个结构

struct Triplet {
    one: i32,
    two: i32,
    three: i32,
}
Run Code Online (Sandbox Code Playgroud)

如果我将它传递给函数,则会隐式复制它.现在,有时我读到某些值不可复制,因此必须移动.

是否有可能使这个结构Triplet不可复制?例如,是否有可能实现一个Triplet不可复制的特性,因此可以"移动"?

我读到某个地方必须实现Clone特征来复制那些不能隐式复制的东西,但是我从来没有读过相反的东西,那就是有一些隐式可复制的东西,并使它不可复制,以便它移动.

这甚至有意义吗?

rust

93
推荐指数
2
解决办法
2万
查看次数

Rust如何提供移动语义?

锈语言网站索赔移动语义的语言的特征之一.但我无法看到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根本没有构造函数,更不用说移动构造函数了.
  • 不支持右值参考.
  • 无法使用rvalue参数创建函数重载.

Rust如何提供移动语义?

move-semantics rust

37
推荐指数
3
解决办法
8225
查看次数

什么是Rust中的移动语义?

在Rust中,有两种可能性来引用

  1. 借用,即参考,但不允许改变参考目的地.该&运营商借用值所有权.

  2. 可变地借用,即参考改变目的地.该&mut运营商性情不定地借用一个值所有权.

有关借用规则Rust文档说:

首先,任何借入必须持续不超过所有者的范围.其次,您可能拥有这两种借款中的一种或另一种,但不能同时使用这两种:

  • 一个或多个&T资源的引用(),
  • 一个可变的引用(&mut T).

我相信引用一个引用是创建一个指向值的指针并通过指针访问该值.如果存在更简单的等效实现,则编译器可以优化它.

但是,我不明白什么是移动的意思以及它是如何实现的.

对于实现Copy特征的类型,它意味着复制,例如通过从源分配结构成员,或者a memcpy().对于小结构或原始数据,此副本是有效的.

而对于

这个问题不是什么是移动语义的重复因为Rust和C++是不同的语言,移动语义在两者之间是不同的.

ownership move-semantics rust

21
推荐指数
2
解决办法
5734
查看次数

为什么移动闭包不获取变量的所有权?

Rust 编程语言

如果你想强制闭包取得它在环境中使用的值的所有权,你可以move在参数列表之前使用关键字

我注意到我的代码不会拥有这些值的所有权。我的代码和给定示例之间的差异是:

  • 使用整数而不是Vec
  • 使x可变而不是不可变

示例 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)
  1. 为什么示例 …

closures rust

1
推荐指数
1
解决办法
1465
查看次数

标签 统计

rust ×4

move-semantics ×2

closures ×1

ownership ×1