结构字段中的Rng的Vec,不能将不可变字段作为可变字段借用

evu*_*uez 2 rust

我想创建一个struct包含a的字段Vec<ThreadRng>.

所以这很好用,我有一个存储在Foo.generators以下位置的生成器列表:

extern crate rand;

use std::vec::Vec;
use rand::{Rng, ThreadRng};

struct Foo {
    generators: Vec<ThreadRng>,
}

impl Foo {
    fn new() -> Foo {
        Foo { generators: vec![rand::thread_rng(), rand::thread_rng()]}
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想用它,比如说bar:

impl Foo {
    fn bar(&self) -> i32 {
        self.generators[0].gen::<i32>()
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不能,而且我得到了cannot borrow immutable field 'self.generators' as mutable.

据我所知,我不能使用gen方法,ThreadRng因为它需要对RNG(gen<T: Rand>(&mut self))的可变引用,并且由于我的字段Foo.generators" Vec<ThreadRng>" 的定义没有指定ThreadRng应该是可变的,我不能对它做任何需要可变性的事情.

第一个问题:我对正在发生的事情的理解是正确的,还是我完全错了?如果是这样,有人可以向我解释实际发生了什么吗?

第二个问题:承认我的理解是正确的,我怎么能允许我ThreadRng的行为需要可变性?

提前致谢!

llo*_*giq 5

你需要self可变地借用:

impl Foo {
    fn bar(&mut self) -> i32 {
        self.generators[0].gen::<i32>()
    }
}
Run Code Online (Sandbox Code Playgroud)