我该如何使结构体中的向量可变?

7

我可以使向量是可变的

pub struct Test<'a>{
    vec: &'a mut Vec<i32>,
}
impl<'a> Test<'a> {
    pub fn created()->Test<'a>{
        Test {vec: &'a mut Vec::new() }
    }
    pub fn add(&self, value: i32){  
        self.vec.push(value);
    }
}

expected `:`, found `mut`
Test {vec: &'a mut Vec::new() }
               ^~~

这是一个类似的问题,但答案适用:

答案虽然有效,但如果我不想要,该怎么办?可以使用“应用响应链接”来实现。

pub struct Test{
    vec: Vec<i32>,
}
impl Test {
    pub fn created()->Test {
        Test {vec: Vec::new() }
    }
    pub fn add(&mut self, value: i32){  
        self.vec.push(value);
    }
}
..//
let mut test: my::Test = my::Test::created();
test.add(1i32);

let mut test1: my::Test = my::Test::created();

test1 = test; <-- I do not want, you can do this
..//

我希望能使向量可变,而不必使其成为整个结构体。


很可能是重复的问题,类似于 https://dev59.com/xFwY5IYBdhLWcg3wYm4B。 - Shepmaster
1个回答

10
也许你正在寻找 内部可变性。请不要轻易使用内部可变性,先阅读this
use std::cell::RefCell;

pub struct Test{
    vec: RefCell<Vec<i32>>,
}

impl Test {
    pub fn created()->Test {
        Test {vec: RefCell::new(Vec::new()) }
    }
    pub fn add(&self, value: i32){  
        self.vec.borrow_mut().push(value);
    }
}

fn main() {
    let test = Test::created();
    test.add(1i32);

    let test1 = Test::created();
    // test1 = test; // does not work anymore
}

感谢您的时间和为此案件推荐链接。 - Angel Angel
这本书的链接相当老旧,它链接到新书的一个不讨论“内部可变性”的章节;我认为你会想要 https://doc.rust-lang.org/book/ch15-05-interior-mutability.html。 - Carl Walsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接