Rust 从互斥对象中借用数据”;借来的价值活得不够长。”;

Rust 从互斥对象中借用数据”;借来的价值活得不够长。”;,rust,Rust,如何在结构中包含的互斥体中返回数据的迭代器。编译器给出的错误是“借来的值活得不够长” 如何使值的生存期扩展到外部范围 这里是我试图实现的一个小演示 use std::sync::{Mutex, Arc}; use std::vec::{Vec}; use std::slice::{Iter}; #[derive(Debug)] struct SharedVec { pub data: Arc<Mutex<Vec<u32>>>, } impl Share

如何在结构中包含的互斥体中返回数据的迭代器。编译器给出的错误是“借来的值活得不够长”

如何使值的生存期扩展到外部范围

这里是我试图实现的一个小演示

use std::sync::{Mutex, Arc};
use std::vec::{Vec};
use std::slice::{Iter};

#[derive(Debug)]
struct SharedVec {
  pub data: Arc<Mutex<Vec<u32>>>,
}

impl SharedVec {
  fn iter(& self) -> Iter<u32> {
    self.data.lock().unwrap().iter()
  }
}

fn main() {

  let sv = SharedVec {
    data: Arc::new(Mutex::new(vec![1, 2, 3, 4, 5]))
  };

  for element in sv.data.lock().unwrap().iter() {  // This works
    println!("{:?}", element);
  }

  for element in sv.iter() {  // This does not work
    println!("{:?}", element);
  }
}
使用std::sync::{Mutex,Arc};
使用std::vec::{vec};
使用std::slice::{Iter};
#[导出(调试)]
结构SharedVec{
发布数据:Arc,
}
impl SharedVec{
fn国际热核实验堆(自身)->iter{
self.data.lock().unwrap().iter()
}
}
fn main(){
设sv=SharedVec{
数据:Arc::new(Mutex::new(vec![1,2,3,4,5]))
};
对于sv.data.lock()
println!(“{:?}”,元素);
}
对于sv.iter()中的元素,{//这不起作用
println!(“{:?}”,元素);
}
}

铁锈操场链接:

你不能完全按照你在这里写的方式来做

Rust中的互斥体使用RAII模式进行获取和释放,也就是说,当您调用互斥体上的相应方法(该方法返回一个特殊的保护值)时,您将获取一个互斥体。当这个防护超出范围时,互斥锁被释放

为了使此图案安全,Rust使用其借用系统。您只能通过
lock()
返回的保护来访问互斥锁中的值,并且只能通过引用来访问互斥锁中的值-
MutexGuard
实现
Deref
DerefMut
,因此您可以从中获取
&T
&mut

这意味着您从静音值派生的每个值都必须将其生存期链接到保护的生存期。但是,在您的例子中,您试图返回
Iter
,其生存期参数与
self
的生存期相关联。以下是
iter()
方法的完整签名,没有生命周期参数省略,其主体带有显式临时变量:

fn iter<'a>(&'a self) -> Iter<'a, u32> {
    let guard = self.data.lock().unwrap();
    guard.iter()
}

fn国际热核实验堆我希望你能给我一个非常透彻的解释。