繁体   English   中英

如何在 Rust 中具有可变自身的结构上调用方法

[英]How to call method on struct that has mutable self in Rust

我在以下设置时遇到问题:

#[derive(Debug)]
struct SomeStruct {
    numbers: Vec<u32>,
}

impl SomeStruct {
    fn some_func(&mut self) { // `mut` causes the issue
        self.numbers.push(9); // Contrived but need to call self in here.
        println!("Hello from some func");
    }
}

pub fn main() {
    let struct1 = SomeStruct {
        numbers: vec![1, 2, 3],
    };
    let struct2 = SomeStruct {
        numbers: vec![99, 98, 97],
    };

    let mut vec = Vec::new();
    vec.push(&struct1);
    vec.push(&struct2);

    let first = vec.first_mut().unwrap();

    // cannot borrow `**first` as mutable, as it is behind a `&` reference
    // cannot borrow as mutable rustc(E0596)
    first.some_func();
}

关于可变和借用有很多问题,但我仍然无法弄清楚。 有人可以解释为什么这是错误的以及如何解决它吗?

问题是vec只有共享引用,即&SomeStruct而不是SomeStruct&mut SomeStruct

在此设置中调用some_func()无法成功,因为它需要&mut self 但是,有一些方法可以解决这个问题:

  1. vec拥有SomeStruct ,例如: vec,[struct1, struct2]
  2. &mut struct1&mut struct2推入 vec
  3. 使用内部可变性,例如通过RefCell允许您在持有共享引用的同时修改数据

内部可变性解决方案如下所示:

use std::cell::RefCell;

#[derive(Debug)]
struct SomeStruct {
    numbers: RefCell<Vec<u32>>,
}

impl SomeStruct {
    fn some_func(&self) {
        self.numbers.borrow_mut().push(9); // Contrived but need to call self in here.
        println!("Hello from some func");
    }
}

pub fn main() {
    let struct1 = SomeStruct {
        numbers: RefCell::new(vec![1, 2, 3]),
    };
    let struct2 = SomeStruct {
        numbers: RefCell::new(vec![99, 98, 97]),
    };

    let mut vec = Vec::new();
    vec.push(&struct1);
    vec.push(&struct2);

    let first = vec.first().unwrap();

    // cannot borrow `**first` as mutable, as it is behind a `&` reference
    // cannot borrow as mutable rustc(E0596)
    first.some_func();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM