使用其自身外部的属性来改变结构的简单方法

问题描述 投票:0回答:1

我想在其实现之外使用自身来改变

Outer
结构,而不处理其属性。如何在 Rust 中正确实现它?有没有一种简单的方法可以同时拥有可变和不可变的引用?

这里是代码示例(也许这很牵强,但它很好地说明了我面临的问题):

use std::sync::Mutex;

#[derive(Debug)]
struct Inner {
    n: i64,
    factor: i64,
}

#[derive(Debug)]
struct Max {
    v: i64
}

#[derive(Debug)]
struct Outer {
    inners: Vec<Inner>,
    max: Max,
}

fn main() {
    let mutex_s = Mutex::new(Outer {
        inners: vec![
            Inner { n: 1, factor: 2 },
            Inner { n: 2, factor: 2 },
            Inner { n: 3, factor: 3 },
            Inner { n: 4, factor: 3 },
        ],
        max: Max { v: 5 },
    });

    let mut s = mutex_s.lock().unwrap();
    
    s.inners.retain(|i| i.n * i.factor < s.max.v);

    println!("{:?}", s);
}

这里我收到以下错误:

cannot borrow 's' as immutable because it is also borrowed as mutable

我想这里我需要内部可变性,但我不确定如何正确、优化和有效地实现它。

rust mutex
1个回答
0
投票

您只是将

Mutex
放在了错误的位置,它应该位于
inners
的当前类型周围,而不是整个
Outer
struct
周围。 IE。对于您需要独立访问的每个区域,您都需要一个
Mutex
,这里只是
inners
成员:

#[derive(Debug)]
struct Outer {
    inners: Mutex<Vec<Inner>>,
    max: Max,
}

fn main() {
    let s = Outer {
        inners: Mutex::new(vec![
            Inner { n: 1, factor: 2 },
            Inner { n: 2, factor: 2 },
            Inner { n: 3, factor: 3 },
            Inner { n: 4, factor: 3 },
        ]),
        max: Max { v: 5 },
    };
    
    s.inners.lock().unwrap().retain(|i| i.n * i.factor < s.max.v);

    println!("{:?}", s);
}
© www.soinside.com 2019 - 2024. All rights reserved.