rust 不能包含对Vec内部结构的不同字段的不可变引用和可变引用

7lrncoxx  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(133)

在一个结构体中保持对一个字段的不可变引用,同时修改另一个字段是可以的。但是,如果所述结构体在Vec内部,这是不可能的。有什么替代数据结构可以实现这一点?

struct Data(String,i32);
fn main(){
    let mut v = vec![Data("id".to_string(), 0)];  // Data instance owned by Vec
    let reference_to_id = &v[0].0 as &str;        // Reference to 1st field of Data to be stored elsewhere
    v[0].1 = 1000;                                // Modifying 2nd field of Data

    println!("{}", reference_to_id);              // ERROR
}

error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
 --> r4.rs:5:5
  |
4 |     let reference_to_id = &v[0].0 as &str;
  |                            - immutable borrow occurs here
5 |     v[0].1 = 1000;
  |     ^ mutable borrow occurs here
6 |
7 |     println!("{}", reference_to_id);
  |                    --------------- immutable borrow later used here

我想在Vec中存储一堆struct示例,这些struct的“id”字段不会改变,我想在代码的其他部分使用对该字段的引用(&str)。这是否意味着,我不能修改这些struct中的任何字段?这感觉非常受限。

hujrc8aj

hujrc8aj1#

借位检查器并不理解向量,但是你可以检索一个对该元素的引用,然后它就可以工作了:

let r = &mut v[0];
let reference_to_id = &r.0 as &str;
r.1 = 1000;
vvppvyoh

vvppvyoh2#

这应该行得通。

struct Data(String,i32);
fn main(){
    let mut v = vec![Data("id".to_string(), 0)];  
    let item = &mut v[0];

    item.1 = 1000;
    println!("{}", item.0);            
}

相关问题