如何在rust中创建rBlock的向量?

如何在rust中创建rBlock的向量?,rust,readwritelock,Rust,Readwritelock,我需要做一个struct的向量。向量的每个元素都必须受到RwLock的保护。线程需要在这个向量中读写(多亏了RwLock)。我怎么能在生锈的地方做到呢 我试过用一个弧向量 #[派生(默认、调试、克隆、复制)] pub结构共享值{ x:使用, y:使用, } fn main(){ 让mut shared=vec![Arc::new(RwLock::new(shared_值{x:0,y:0}));10]; //正在更改元素[0]的值 { 让mut sh=shared[0].write().unwra

我需要做一个struct的向量。向量的每个元素都必须受到RwLock的保护。线程需要在这个向量中读写(多亏了RwLock)。我怎么能在生锈的地方做到呢

我试过用一个弧向量

#[派生(默认、调试、克隆、复制)]
pub结构共享值{
x:使用,
y:使用,
}
fn main(){
让mut shared=vec![Arc::new(RwLock::new(shared_值{x:0,y:0}));10];
//正在更改元素[0]的值
{
让mut sh=shared[0].write().unwrap();
*sh=共享_值{x:10,y:10};
}
//印刷品
{
println!(“Print RwLock”);
对于0..g.ns中的i{
{
让val=shared[i].read().unwrap();
println!(“{:?}”,val);
}
}
}
}
结果是:

rwlockdeadguard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
RwLockReadGuard{lock:RwLock{data:shared_值{suiter:10,ws:10}}
我希望元素0被设置为{x:10,y:10}


我认为Arc增加了共享_值{x:0,y:0}的计数引用,但没有为向量中的每个索引创建独立元素。

此向量初始化克隆参数。使用:

使用std::sync::{Arc,RwLock};
#[派生(默认、调试、克隆、复制)]
pub结构共享值{
x:使用,
y:使用,
}
fn main(){
让我们分享:Vec=
std::iter::repeat_with(| | Arc::new(RwLock::new(sharedvalue{x:0,y:0})))
.take(10)
.收集();
//正在更改元素[0]的值
{
让mut sh=shared[0].write().unwrap();
*sh=共享值{x:10,y:10};
}
//印刷品
{
println!(“Print RwLock”);
对于共享中的x{
println!(“{:?}”,x.read().unwrap());
}
}
}
如果您错过了宏的简单性,您可以编写自己的:

macro_rules! vec_no_clone {
    ( $val:expr; $n:expr ) => {{
        let result: Vec<_> = std::iter::repeat_with(|| $val).take($n).collect();
        result
    }};
}

fn main() {
    let shared = vec_no_clone![Arc::new(RwLock::new(SharedValues { x: 0, y: 0 })); 10];
}
macro\u规则!vec\u无克隆{
($val:expr;$n:expr)=>{{
让结果:Vec=std::iter::用(| |$val.take($n).collect()重复_;
结果
}};
}
fn main(){
让shared=vec_no_clone![Arc::new(rblock::new(sharedvalue{x:0,y:0}));10];
}

谢谢,这正是我想要的。:)请注意,类型应使用PascalCase编写。
macro_rules! vec_no_clone {
    ( $val:expr; $n:expr ) => {{
        let result: Vec<_> = std::iter::repeat_with(|| $val).take($n).collect();
        result
    }};
}

fn main() {
    let shared = vec_no_clone![Arc::new(RwLock::new(SharedValues { x: 0, y: 0 })); 10];
}