【问题标题】:How do I modify a borrowed struct's field in Rust?如何在 Rust 中修改借用结构的字段?
【发布时间】:2020-06-03 18:37:13
【问题描述】:

我有一个 &mut 对结构的引用。我想重新分配引用结构的字段,但我只得到cannot assign to current_node.parameter because it is borrowed

我也在current_node 声明中尝试过let ref mut,但发生了同样的问题。

pub fn create_ars_tree() {
    let mut top_level_node = NodeItem {
        key: StringOrNodeItems::Text(String::new()),
        parameter: StringOrNodeItems::Text(String::new()),
        parent_item: None,
    };
    let mut current_node = &mut top_level_node; //Reference to the currently edited node
    let mut current_part = &current_node.key; //Reference to the currently edited string
    for current_char in "abcdef".chars() {
        if current_char == '{' {
            //Handle new opening bracket
            match current_part {
                StringOrNodeItems::Text(text) => {
                    current_node.key = StringOrNodeItems::Keys(vec![
                        NodeItem {
                            key: StringOrNodeItems::Text(text.to_string()),
                            parameter: StringOrNodeItems::Text(String::new()),
                            parent_item: Some(current_node)
                            //parent_item: None
                        }
                    ]);
                },
                StringOrNodeItems::Keys(keys) => {
                    unimplemented!();
                }
            }
        }
    }
}

#[derive(Debug)]
pub struct NodeItem<'a> {
    key: StringOrNodeItems<'a>,
    parameter: StringOrNodeItems<'a>,
    parent_item: Option<&'a NodeItem<'a>>,
}

#[derive(Debug)]
enum StringOrNodeItems<'a> {
    Text(String),
    Keys(Vec<NodeItem<'a>>),
}

错误:

error[E0506]: cannot assign to `current_node.key` because it is borrowed
  --> src/lib.rs:14:6
   |
8  |     let mut current_part = &current_node.key; //Reference to the currently edited string
   |                            ----------------- borrow of `current_node.key` occurs here
...
12 |             match current_part {
   |                   ------------ borrow later used here
13 |                 StringOrNodeItems::Text(text) => {
14 |                     current_node.key = StringOrNodeItems::Keys(vec![
   |                     ^^^^^^^^^^^^^^^^ assignment to borrowed `current_node.key` occurs here

Playground

【问题讨论】:

  • 好的,感谢您对问题的帮助。在创建 MRE 时,我不小心找到了解决问题的方法。我猜问题已经结束了

标签: rust borrow-checker borrowing


【解决方案1】:

我已经想通了。问题是我试图在借用同一个变量的块内分配current_node。如果将 Some(current_node) 替换为 None 它会编译

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多