rust - 将结构的成员传递给 Rust 中相同结构的方法

标签 rust borrowing

我现在面临一个 Rust 的借用问题,我有一个解决它的想法。但我认为我找到的方式不是一个好的答案。所以我想知道是否有其他方法可以解决它。

我用下面的示例代码来描述我的情况:

struct S {
    val: u8
}

impl S {
    pub fn f1(&mut self) {
        println!("F1");
        self.f2(self.val);
    }

    pub fn f2(&mut self, input: u8) {
        println!("F2");

        // Do something with input
    }
}

fn main() {
    let mut s = S {
        val: 0
    };

    s.f1();
}

结构 S 有一个方法 f2,它需要一个额外的参数 input 来做某事。还有另一种方法,f1,它使用结构体Sval调用f2。局外人可以针对不同的用例调用 f1f2

当我编译上面的代码时,我得到了以下错误信息:

src\main.rs:9:17: 9:25 error: cannot use `self.val` because it was mutably borrowed [E0503]
src\main.rs:9         self.f2(self.val);
                              ^~~~~~~~
src\main.rs:9:9: 9:13 note: borrow of `*self` occurs here
src\main.rs:9         self.f2(self.val);
                      ^~~~

我大致了解了 Rust 中的借用是如何工作的。所以我知道我可以通过将 f1 的实现更改为:

来解决问题
pub fn f1(&mut self) {
    let v = self.val;
    println!("F1");
    self.f2(v);
}

但是,我觉得这个解决方案有点多余。我想知道是否有办法不使用额外的变量绑定(bind)来解决这个问题。

最佳答案

您的解决方案有效不是因为额外的变量绑定(bind),而是因为额外的复制。整数类型可以隐式复制,因此 let v = self.val 创建值的副本。该副本不是从 self 那里借来的,而是自己拥有的。因此编译器允许您使用此副本调用 f2

如果您编写self.f2(self.val),编译器也会尝试复制self.val。但是,在这个位置不可能进行复制,因为 self 是为函数调用借用的。所以除非你复制它之前的值,否则不可能进行这样的调用。这不是语法限制,而是借用检查器的强制执行。无论如何,最好按照实际发生的顺序编写复制和调用。

如果您尝试用作参数的类型不是Copy(例如String),您需要编写let v = self。 val.clone(); self.f2(v); 明确要求编译器复制。不允许在不复制的情况下进行此类调用。您可能需要使方法不可变或以某种方式消除参数。

关于rust - 将结构的成员传递给 Rust 中相同结构的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39150985/

相关文章:

rust - 当返回对范围外值的可变引用的不可变引用时,为什么在范围结束时丢弃可变引用?

for-loop - 如何在循环遍历Vector的for循环内传递Vector

rust - 为什么使用 LTO 会增加我的 Rust 二进制文件的大小?

rust - 如何将可变引用传递给属于该引用的对象上的方法?

rust - 我在哪里可以找到 Rust 编程语言书中提到的源代码(.rs 文件)?

hashmap - 使用入口模式时如何改变 HashMap 的其他元素?

Rust 借用检查器在 if 语句中抛出错误

rust - Rust是否会缩小生命周期以满足对其定义的约束?

floating-point - 如何用 nom 解析完整的 f32?

Rust:如何对大文件进行 HTTP PUT?