gpt4 book ai didi

rust - 不能作为可变借用,因为它在 `&` 引用后面

转载 作者:行者123 更新时间:2023-11-29 08:24:17 25 4
gpt4 key购买 nike

为了更好地了解 Rust,我正在构建一个简单的文本编辑器并具有以下结构:

struct File {
rows: Vec<Row>,
filename: Option<String>
}

impl File {
fn row(&self, index: u16) -> &Row{
&self.rows[index as usize]
}

}

struct Row {
string: String,
}

struct EditorState {
file: File,
}

如您所见,我将编辑器的状态保存在一个结构中,该结构引用文件,其中包含许多行,其中包含一个字符串(这些结构中的每一个都有更多字段,但我已经删除了与问题无关的)

现在我想让我的行可编辑并添加了这个:

impl Row {
fn insert(&mut self, at: u16, c: char) {
let at = at as usize;
if at >= self.string.len() {
self.string.push(c);
} else {
self.string.insert(at, c)
}
}
}

这就是我尝试更新行的方式:

//In the actual functon, I am capturing the keypress,
//get the correct row from the state and pass it and the pressed
// char to row.insert
fn update_row(mut state: &mut EditorState) {
let row = &state.file.row(0);
row.insert(0, 'a');

}

编译失败:

error[E0596]: cannot borrow `*row` as mutable, as it is behind a `&` reference

从错误中,我可以看出问题是 Row 应该是可变的,所以我可以编辑它(这是有道理的,因为我正在改变它的字符串)。我无法弄清楚 a) 如何能够在这里改变字符串,以及 b) 如何在 row 始终返回可变引用的情况下执行此操作,就像在所有其他情况下一样,我正在调用row 读取一行,而不是写入它。

最佳答案

这是File 的更惯用的实现:

impl File {
fn row(&self, index: usize) -> Option<&Row> {
self.rows.get(index)
}

fn row_mut(&mut self, index: usize) -> Option<&mut Row> {
self.rows.get_mut(index)
}
}

此处注意事项:

  • 如果 index 超出范围,您的实现将会崩溃。处理此问题的惯用方法是返回一个选项,getget_mut 允许您免费获取。
  • 使用 u16 没有多大意义,因为 Vec 是使用 usize 索引的。除非您真的想提供硬编码限制,否则在这里使用 u16 是任意的。在这种情况下,我不会依赖类型的最大值,而是依赖常量,这样会使意图更清晰。

关于rust - 不能作为可变借用,因为它在 `&` 引用后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57437256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com