Rust 从不可变数组获取可变引用

Rust 从不可变数组获取可变引用,rust,borrow-checker,Rust,Borrow Checker,我不知道标题的措辞是否正确,但问题是: let mut rows: Vec<Box<String>> = vec![]; let row1 = &mut **rows.get(0).unwrap(); 这使得一次不能借用多个可变的“行” 另一种解决方案是仅在需要使用时获取每一行,然后在需要再次使用时再次获取,但我认为这不是一个非常有效的想法,因为每次需要更改数组中的某些内容时,我都必须遍历数组以找到所需的行(我不会通过索引获取数组元素) 编辑:我试图设计如何存

我不知道标题的措辞是否正确,但问题是:

let mut rows: Vec<Box<String>> = vec![];

let row1 = &mut **rows.get(0).unwrap();
这使得
一次不能借用多个可变的“行”

另一种解决方案是仅在需要使用时获取每一行,然后在需要再次使用时再次获取,但我认为这不是一个非常有效的想法,因为每次需要更改数组中的某些内容时,我都必须遍历数组以找到所需的行(我不会通过索引获取数组元素)

编辑:我试图设计如何存储字符串的可变引用,因为Rust的编译器不允许我这样做。要么我缺少了一些可以对字符串进行多个可变引用的方法,要么我需要找到另一种方法来实现这一点。我需要对框中包含的内容进行可变引用,在我的程序中,它们不是字符串,它们是具有可变函数的结构,但是为了简单起见,我在这里使用了字符串。这里有一些代码可以澄清这一点

struct Table
{
    cols: Vec<Box<Col>>
}

//...

let mut table = Table::new();

let mut id_col          = table.new_col("ID"        .to_owned());
let mut status_col      = table.new_col("Status"    .to_owned());
let mut title_col       = table.new_col("Title"     .to_owned());
let mut deadline_col    = table.new_col("Deadline"  .to_owned());
let mut tags_col        = table.new_col("Tags"      .to_owned());
let mut repeat_col      = table.new_col("Repeat"    .to_owned());
struct表
{
cols:Vec
}
//...
让mut table=table::new();
让mut id_col=table.new_col(“id.to_owned());
让mut status_col=table.new_col(“status.to_owned());
让mut title_col=table.new_col(“title.to_owned());
让mut deadline_col=table.new_col(“deadline.to_owned());
让mut tags_col=table.new_col(“tags.to_owned());
让mut repeat_col=table.new_col(“repeat.to_owned());
(我在第一个示例中使用了行,以便更容易理解) 我将迭代一些数据并向这些列添加内容,因此我不希望在每次迭代中按向量中的名称搜索它们,我希望对它们进行“缓存”引用(这些都是变量)。问题是我的编译器不允许我这样做,因为我不能多次借用表作为可变表。所以我的意思是“围绕设计”改变了我的思维方式,重新构造了我的代码,所以我没有这个问题


我想存储多个字符串的可变引用,这些字符串存储在向量的框中。这应该是非常安全的,因为我没有引用向量中的任何内容,只是从向量中获取一个框,取消引用并更改它指向的内存。如果向量变得太大,需要重新分配其数据,我的字符串将保持不变

编译器根本不知道这一点,而且也不确定:在您的方案中,没有任何东西可以阻止在同一个框或字符串上获得第二个可变句柄并破坏它

存在于这种情况下(“内部可变性”是您想要寻找的概念),它意味着运行时性能受到影响,因为它需要跟踪现有借用(它基本上是一个单线程RWLock)

我可以使行可变并使用get_mut,但是我不能同时对两行进行可变引用

这就是拆分(和朋友)的目的

(为了便于理解,我在第一个示例中使用了行)我将迭代一些数据并将内容附加到这些列中,因此我不想在每次迭代中按名称在向量中搜索它们,我希望对它们进行“缓存”引用(这些都是变量)。问题是我的编译器不允许我这样做,因为我不能多次借用表作为可变表。所以我的意思是“围绕设计”改变了我的思维方式,重新构造了我的代码,所以我没有这个问题

是的,不,这不仅仅是在集合的不同部分上具有可变句柄,还包括在修改父级时具有可变句柄。您可能需要Rc(而不是Box)和RefCell(用于内部可变)

或者执行第二次
split\u first\u mut
或展开迭代器:

let mut t=table.cols.iter_mut();
让id_col=t.next().unwrap();
让status_col=t.next().unwrap();
让title_col=t.next().unwrap();
让最后期限=t.next().unwrap();
让tags_col=t.next().unwrap();
让我们重复一下;

问题是,在所有这些引用都失效之前,您将无法修改
。而且它很难看。

可能是因为help@Stargateur我只是在问题中添加了更多的信息。@kmdreko我会调查的,谢谢“这应该是非常安全的,因为我没有引用向量中的任何内容,只是从向量中获取一个框,取消引用并更改它指向的内存。”我认为这不对。如果您更改内存,它指向旧内存,必须释放,但如果有多个线程读取,则会崩溃。因此需要一些同步。
struct Table
{
    cols: Vec<Box<Col>>
}

//...

let mut table = Table::new();

let mut id_col          = table.new_col("ID"        .to_owned());
let mut status_col      = table.new_col("Status"    .to_owned());
let mut title_col       = table.new_col("Title"     .to_owned());
let mut deadline_col    = table.new_col("Deadline"  .to_owned());
let mut tags_col        = table.new_col("Tags"      .to_owned());
let mut repeat_col      = table.new_col("Repeat"    .to_owned());