我正在阅读有关生命的 rust 迹文件.我试过这样的方法:

struct S {
    x: i8,
}

impl S {
    fn fun(self) {}

    fn print(&self) {
        println!("{}", self.x);
    }
}

fn main() {
    let s = S { x: 1 };
    s.fun();
    s.print();
}

我得到以下错误:

error[E0382]: borrow of moved value: `s`
  --> src/main.rs:16:5
   |
15 |     s.fun();
   |     - value moved here
16 |     s.print();
   |     ^ value borrowed here after move
   |
   = note: move occurs because `s` has type `S`, which does not implement the `Copy` trait

这是因为fun(self)方法拥有s实例的所有权.这可以通过更改为fun(&self)来解决.

我不明白你为什么想要一个对象上的方法控制自己.我只能想到一个例子,一个析构函数方法,但是如果你想处理这个对象,那么它无论如何都会由对象的所有者来处理(在这个例子中,范围是main).

为什么可以编写一个拥有 struct 所有权的方法?在任何情况下,你会想要这个吗?

推荐答案

在Rust标准库文档中,引用"控制"self 的方法的惯用方式是说它"消耗"了self .如果你搜索这个,你应该找到一些例子:

至于原因:你可以try 重写Iterator::map——你最终会有一个终生参数四处游荡,很快就会变得难以管理.为什么?因为Map迭代器基于上一个迭代器,所以borrow 判断器将强制您只能同时使用这两个迭代器中的一个.

Rust相关问答推荐

Rust为什么应用于引用的操作符可以强制,而具有显式类型的let则不能?

常量泛型和类型枚举箱有重叠的用途吗?

使用pyo3::Types::PyIterator的无限内存使用量

铁 rust 干线无法使用PowerShell获取环境变量

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

制作一片连续整数的惯用Rust 方法?

为什么Option类型try块需要类型注释?

如何使用reqwest进行异步请求?

为什么BufReader实际上没有缓冲短寻道?

如何轮询 Pin>?

将 &str 或 String 保存在变量中

OpenGL 如何同时渲染无纹理的四边形和有纹理的四边形

Rust中是否可以在不复制的情况下从另一个不可变向量创建不可变向量?

Rust:`sort_by` 多个条件,冗长的模式匹配

borrow 匹配手臂内部的可变

使用 `clap` 在 Rust CLI 工具中设置布尔标志

为什么在 rust 中删除 vec 之前应该删除元素

在 FFI 的上下文中,未初始化是什么意思?

覆盖类型的要求到底是什么?为什么单个元素元组满足它?

如何断言代码不会在测试中编译?