Rust 可变ref在闭包内变得不可变

Rust 可变ref在闭包内变得不可变,rust,Rust,我有这个函数来生成一个随机向量 pub fn random_vec(r: &mut rng::Rng, n: u32) -> Vec<Flo> { (0..n).map(|_| r.next_normal()).collect() } pub fn random_vec(r:&mut rng::rng,n:u32)->vec{ (0..n).map(| | r.next_normal()).collect() } 我用它来生成一个由3个随机向量组成的向量,就

我有这个函数来生成一个随机向量

pub fn random_vec(r: &mut rng::Rng, n: u32) -> Vec<Flo> {
    (0..n).map(|_| r.next_normal()).collect()
}
pub fn random_vec(r:&mut rng::rng,n:u32)->vec{
(0..n).map(| | r.next_normal()).collect()
}
我用它来生成一个由3个随机向量组成的向量,就像这样

let xs: Vec<Vec<Flo>> =
    (0..3).map(|_| random_vec(&mut r, n)).collect();
让xs:Vec=
(0..3).map(| | random_vec(&mut r,n)).collect();
这个很好用。现在我尝试将这一行提取到一个函数中

fn random_vecs(r: &mut rng::Rng, n: u32) -> Vec<Vec<Flo>> {
    (0..3).map(|_| random_vec(&mut r, n)).collect()
}
fn随机向量(r:&mut rng::rng,n:u32)->Vec{
(0..3).map(| | random_vec(&mutr,n)).collect()
}

此操作失败,并显示消息:“闭包无法分配给不可变参数`r`”。为什么Rust希望
r
是不可变的?

从技术上讲,因为
random\u-vecs
的形式参数
r
是不可变的,并且通过主体中的
&mut r
您正试图构造对它的可变引用

下面是一个简单的示例,介绍了您正在做的工作的要点:

fn modify0(r: &mut usize) {
    *r += 1;
}

fn modify1(r: &mut usize) {
    modify0(&mut r);
}

fn main() {
    let mut a = 1;
    modify1(&mut a);

    println!("Hello, {:?}!", a);
}
错误消息是

error[E0596]: cannot borrow immutable argument `r` as mutable --> src/main.rs:6:18 | 6 | modify0(&mut r); | ^ cannot borrow mutably help: consider removing the `&mut`, as it is an immutable binding to a mutable reference 最好按照错误消息中的建议,删除多余的
&mut

fn modify1(r: &mut usize) {
    modify0(r);
}

从技术上讲,因为
随机向量
的形式参数
r
是不可变的,并且通过主体中的
&mut r
,您试图构造对它的可变引用

下面是一个简单的示例,介绍了您正在做的工作的要点:

fn modify0(r: &mut usize) {
    *r += 1;
}

fn modify1(r: &mut usize) {
    modify0(&mut r);
}

fn main() {
    let mut a = 1;
    modify1(&mut a);

    println!("Hello, {:?}!", a);
}
错误消息是

error[E0596]: cannot borrow immutable argument `r` as mutable --> src/main.rs:6:18 | 6 | modify0(&mut r); | ^ cannot borrow mutably help: consider removing the `&mut`, as it is an immutable binding to a mutable reference 最好按照错误消息中的建议,删除多余的
&mut

fn modify1(r: &mut usize) {
    modify0(r);
}

请检查如何创建一个,然后检查您的问题以将其包括在内。我们无法说出代码中存在哪些板条箱、类型、特征、字段等。例如,我们不知道什么是
rng
Flo
。试着制造一些能再现你在网络上的错误的东西,或者你可以在一个全新的货运项目中再现它。还有。请阅读完整的错误消息。然后按照它的建议删除函数中的
&mut
。谢谢,按照编译器的建议删除
&mut
是有效的。不幸的是,VSCode只显示消息的开头;我必须使用CLI来阅读(极好的)提示!请检查如何创建一个,然后检查您的问题以将其包括在内。我们无法说出代码中存在哪些板条箱、类型、特征、字段等。例如,我们不知道什么是
rng
Flo
。试着制造一些能再现你在网络上的错误的东西,或者你可以在一个全新的货运项目中再现它。还有。请阅读完整的错误消息。然后按照它的建议删除函数中的
&mut
。谢谢,按照编译器的建议删除
&mut
是有效的。不幸的是,VSCode只显示消息的开头;我必须使用CLI来阅读(极好的)提示!我发现有趣的是,引用的引用仍然引用底层数据,即引用链不知何故被锈蚀压平。我仍然没有一个好的心理模型。这就是我困惑的地方。我想这是为了避免一直写
(*foo).bar()
,我们必须付出的代价。我发现有趣的是,引用引用仍然引用底层数据,即引用链不知何故被锈蚀压扁。我仍然没有一个好的心理模型。这就是我困惑的地方。我想这是我们为了避免一直写
(*foo).bar()
而必须付出的代价。