Rust Arc<;互斥锁<;T>&燃气轮机;内部闭包:应为实现`Fn`特性的闭包,但此闭包只实现`Fn`一次`
我正在尝试与闭包共享一个Rust Arc<;互斥锁<;T>&燃气轮机;内部闭包:应为实现`Fn`特性的闭包,但此闭包只实现`Fn`一次`,rust,Rust,我正在尝试与闭包共享一个Arc。我得到一个错误,closure是FnOnce,因为它将变量shared\u wake\u deque\ucode>移出其环境: use core::task::{Context, Poll, Waker}; use hyper::client::connect::{Connection, Connected}; use std::sync::{Arc, Mutex}; use std::collections::VecDeque; pub type OnPoll
Arc
。我得到一个错误,closure是
FnOnce,因为它将变量
shared\u wake\u deque\ucode>移出其环境:
use core::task::{Context, Poll, Waker};
use hyper::client::connect::{Connection, Connected};
use std::sync::{Arc, Mutex};
use std::collections::VecDeque;
pub type OnPollRead = Arc<dyn Fn(&mut Context<'_>, &mut tokio::io::ReadBuf<'_>) -> Poll<std::io::Result<()>> + Send + Sync>;
pub type OnPollWrite = Arc<dyn Fn(&mut Context<'_>, &[u8]) -> Poll<core::result::Result<usize, std::io::Error>> + Send + Sync>;
#[derive(Clone)]
pub struct CustomTransporter {
on_poll_read: Option<OnPollRead>,
on_poll_write: Option<OnPollWrite>,
}
pub struct OVPNClient {
}
impl OVPNClient {
pub fn send(&self, buffer: &[u8]) {
}
}
unsafe impl Send for OVPNClient {}
unsafe impl Send for CustomTransporter {}
impl CustomTransporter {
pub fn new(on_poll_read: Option<OnPollRead>, on_poll_write: Option<OnPollWrite>) -> CustomTransporter {
CustomTransporter{
on_poll_read: on_poll_read,
on_poll_write: on_poll_write
}
}
}
fn main () {
let openvpn_client = Arc::new(Mutex::new(OVPNClient{}));
let shared_wake_deque = Arc::new(Mutex::new(VecDeque::<Waker>::new()));
let shared_wake_deque_ = shared_wake_deque.clone();
let on_poll_read = Arc::new(|context: &mut Context, buffer: &mut tokio::io::ReadBuf| -> Poll<std::io::Result<()>> {
let shared_wake_deque__ = shared_wake_deque_;
Poll::Ready(Ok(()))
});
let on_poll_write = Arc::new(|context: &mut Context, buffer: &[u8]| -> Poll<core::result::Result<usize, std::io::Error>>{
openvpn_client.lock().unwrap().send(buffer);
Poll::Ready(Ok(0))
});
let connector = CustomTransporter::new(Some(on_poll_read), Some(on_poll_write));
}
use core::task::{Context,Poll,Waker};
使用hyper::client::connect::{Connection,Connected};
使用std::sync::{Arc,Mutex};
使用std::collections::VecDeque;
发布类型OnPollRead=Arc)->轮询+发送+同步>;
发布类型OnPollWrite=Arc,因为您有
let shared_wake_deque__ = shared_wake_deque_;
作为一项简单的作业,它与
let foo = vec![];
let foo2 = foo;
其中,运行代码将vec的所有权从foo
转移到foo2
。因为在lambda中有这个值,所以运行显式地将shared\u wake\u deque\u
值的所有权转移到shared\u wake\u deque\u
,这意味着shared\u wake\u deque\u
不能再使用了。为了实现这一点,需要在轮询读取时只能运行一次,否则多个对象将试图拥有同一个对象(因为它需要拥有它才能在将来的某个调用中使用,上的和之前任何调用中的共享的\u wake\u deque\u
也必须拥有它)。因为这违反了Rust的安全保证,因为某些东西只能由一个东西拥有,所以您得到了这个错误
最有可能的是,你想要的是给我们一个参考,例如
let shared_wake_deque__ = &shared_wake_deque_;
通过引用shared\u wake\u deque\u
,闭包可以运行多次并给出多个共享引用。但是,仅此一项,您就可以得到
error[E0597]: `shared_wake_deque_` does not live long enough
因为您试图引用在闭包外部声明的变量,而闭包可能会在删除shared\u wake\u deque\u
后运行。要解决此问题,您需要闭包获得shared\u wake\u deque\u
的所有权,这是通过使用move
关键字来实现的,例如
let on_poll_read = Arc::new(move |context: &mut Context, buffer: &mut tokio::io::ReadBuf| -> Poll<std::io::Result<()>> {
let shared_wake_deque__ = &shared_wake_deque_;
因为你有
let shared_wake_deque__ = shared_wake_deque_;
作为一项简单的作业,它与
let foo = vec![];
let foo2 = foo;
其中,运行代码将vec的所有权从foo
转移到foo2
。因为在lambda中有这一点,所以运行显式地将shared_wake_deque_
值的所有权转移到shared_wake_deque_
,这意味着shared_wake_deque_
不能再使用了。为此,这是可能的e、 需要的是,on\u poll\u read
只能运行一次,因为否则多个对象将试图拥有同一个对象(on\u poll\u read
,因为它需要拥有该对象才能在将来的某个调用中使用,并且来自任何以前调用的共享唤醒\u deque\u
也必须拥有该对象).因为这违反了Rust的安全保证,因为某些东西只能归一个东西所有,所以您会得到这个错误
最有可能的是,你想要的是给我们一个参考,例如
let shared_wake_deque__ = &shared_wake_deque_;
通过引用shared\u wake\u deque\u
,闭包可以运行多次并给出多个共享引用。但是,仅此一项,您就可以得到
error[E0597]: `shared_wake_deque_` does not live long enough
因为您试图引用在闭包外部声明的变量,而闭包可能会在删除shared\u wake\u deque\u
后运行。要解决此问题,您需要闭包获得shared\u wake\u deque\u
的所有权,这是通过使用move
关键字来实现的,例如
let on_poll_read = Arc::new(move |context: &mut Context, buffer: &mut tokio::io::ReadBuf| -> Poll<std::io::Result<()>> {
let shared_wake_deque__ = &shared_wake_deque_;
()