如何实现 JavaScript 风格的回调?
How do I implement a JavaScript-style callback?
我正在尝试实现 JavaScript 风格的回调。我有一个使用库的应用程序(两者都是我的),我需要应用程序能够将闭包或函数传递给库中的方法,然后在满足条件时生成线程并在线程内部调用回调。
main.rs
fn main(){
welcome_message();
mylib::connect(|| println!("Connected to service! Please enter a command. (hint: help)\n\n"));
loop {
match prompt_input() {
true => {},
false => break,
}
}
}
lib.rs
pub fn connect<F>(resolve: F) -> (mpsc::Sender<Message>, mpsc::Receiver<Message>)
where F: Fn()
{
...
let receive_loop = Thread::scoped(move || {
for response in receiver.incoming_messages::<Message>(){
let json_string = match response.unwrap() {
Message::Text(txt) => txt,
_ => "".to_string(),
};
let message = json::Json::from_str(json_string.as_slice());
let message_json = message.unwrap();
if message_json.is_object() {
let ref something = receiver_tx;
let obj = message_json.as_object().unwrap();
let something_json = obj.get("lsri").unwrap();
let something = something_json.to_string().replace("\"", "");
match something.as_slice() {
"service#connected" => resolve(),
_ => println!("{}", type),
}
} else {
println!("Invalid service response");
}
}
});
...
}
错误
src/lib.rs:54:24: 54:38 error: the trait `core::marker::Send` is not implemented for the type `F` [E0277]
src/lib.rs:54 let receive_loop = Thread::scoped(move || {
^~~~~~~~~~~~~~
src/lib.rs:54:24: 54:38 note: `F` cannot be sent between threads safely
src/lib.rs:54 let receive_loop = Thread::scoped(move || {
^~~~~~~~~~~~~~
我传递的不一定是闭包,我也可以传递一个函数。它不需要任何参数或 return 类型,但如果有帮助,我可以添加一些虚拟参数。我非常愿意接受其他方法或方式来实现相同目标的建议。
我试过使用:
- 线程::生成
- FnMut()
- Arc::new(resolve)(带有 .clone() 的实现)
- Arc::new(Mutex::new(resolve))(执行 .lock())
- 正在搜索 Google 示例
- 完整阅读 Rust 书
- 正在搜索错误消息以获取示例
- 以上所有的各种配置
Rust 可以吗?有没有更好的方法?
提前感谢您的宝贵时间。
解法:
对于将来发现此问题的任何人,根据下面答案的说明,我将 connect
的签名更改为以下内容,这允许将回调传递到线程中。
pub fn connect<'a, T, F>(resolve: F) -> (mpsc::Sender<Message>, mpsc::Receiver<Message>)
where T: Send + 'a, F: FnOnce() -> T, F: Send + 'a
尝试使用与 Thread::scoped 相同的限制标记您的 F
:
fn scoped<'a, T, F>(f: F) -> JoinGuard<'a, T>
where T: Send + 'a, F: FnOnce() -> T, F: Send + 'a
具体来说,将类型与 Send
特征绑定应该清除
的直接错误
the trait core::marker::Send
is not implemented for the type F
我正在尝试实现 JavaScript 风格的回调。我有一个使用库的应用程序(两者都是我的),我需要应用程序能够将闭包或函数传递给库中的方法,然后在满足条件时生成线程并在线程内部调用回调。
main.rs
fn main(){
welcome_message();
mylib::connect(|| println!("Connected to service! Please enter a command. (hint: help)\n\n"));
loop {
match prompt_input() {
true => {},
false => break,
}
}
}
lib.rs
pub fn connect<F>(resolve: F) -> (mpsc::Sender<Message>, mpsc::Receiver<Message>)
where F: Fn()
{
...
let receive_loop = Thread::scoped(move || {
for response in receiver.incoming_messages::<Message>(){
let json_string = match response.unwrap() {
Message::Text(txt) => txt,
_ => "".to_string(),
};
let message = json::Json::from_str(json_string.as_slice());
let message_json = message.unwrap();
if message_json.is_object() {
let ref something = receiver_tx;
let obj = message_json.as_object().unwrap();
let something_json = obj.get("lsri").unwrap();
let something = something_json.to_string().replace("\"", "");
match something.as_slice() {
"service#connected" => resolve(),
_ => println!("{}", type),
}
} else {
println!("Invalid service response");
}
}
});
...
}
错误
src/lib.rs:54:24: 54:38 error: the trait `core::marker::Send` is not implemented for the type `F` [E0277]
src/lib.rs:54 let receive_loop = Thread::scoped(move || {
^~~~~~~~~~~~~~
src/lib.rs:54:24: 54:38 note: `F` cannot be sent between threads safely
src/lib.rs:54 let receive_loop = Thread::scoped(move || {
^~~~~~~~~~~~~~
我传递的不一定是闭包,我也可以传递一个函数。它不需要任何参数或 return 类型,但如果有帮助,我可以添加一些虚拟参数。我非常愿意接受其他方法或方式来实现相同目标的建议。
我试过使用:
- 线程::生成
- FnMut()
- Arc::new(resolve)(带有 .clone() 的实现)
- Arc::new(Mutex::new(resolve))(执行 .lock())
- 正在搜索 Google 示例
- 完整阅读 Rust 书
- 正在搜索错误消息以获取示例
- 以上所有的各种配置
Rust 可以吗?有没有更好的方法?
提前感谢您的宝贵时间。
解法:
对于将来发现此问题的任何人,根据下面答案的说明,我将 connect
的签名更改为以下内容,这允许将回调传递到线程中。
pub fn connect<'a, T, F>(resolve: F) -> (mpsc::Sender<Message>, mpsc::Receiver<Message>)
where T: Send + 'a, F: FnOnce() -> T, F: Send + 'a
尝试使用与 Thread::scoped 相同的限制标记您的 F
:
fn scoped<'a, T, F>(f: F) -> JoinGuard<'a, T>
where T: Send + 'a, F: FnOnce() -> T, F: Send + 'a
具体来说,将类型与 Send
特征绑定应该清除
the trait
core::marker::Send
is not implemented for the typeF