我尝试使用以下代码从闭包内发送信号。
use std::thread;
use std::sync::mpsc::channel;
fn main() {
let (tx, rx) = channel();
let t1 = thread::spawn(move || {
watch(|x| tx.send(x));
});
let t2 = thread::spawn(move || {
println!("{:?}", rx.recv().unwrap());
});
let _ = t1.join();
let _ = t2.join();
}
fn watch<F>(callback: F) where F : Fn(String) {
callback("hello world".to_string());
}
但是,它无法编译引发以下错误:
src/test.rs:8:19: 8:29 note: expected type `()`
src/test.rs:8:19: 8:29 note: found type `std::result::Result<(), std::sync::mpsc::SendError<std::string::String>>`
我错过了什么吗?
答案 0 :(得分:3)
您已声明您的Rails.application.routes.draw do
devise_for :users
root 'homes#show'
resources :users, only: [:show, :edit, :update]
resources :posts, only: [:new, :create]
resource :relationships, only: [:create, :destroy]
函数收到watch
类型的闭包。通常,闭包类型包括其返回类型:Fn(String)
。 Fn(String) -> SomeReturnType
相当于Fn(String)
,意味着您的闭包应该返回一个空元组Fn(String) -> ()
。 ()
通常与C中的()
类似。
但是,您尝试使用的关闭(void
)会返回|x| tx.send(x)
。您可以在std::result::Result<(), std::sync::mpsc::SendError<std::string::String>>
上使用unwrap()
来检查操作是否已成功并使闭包返回Result
:
()
或者,您可以以这种方式声明watch(|x| tx.send(x).unwrap());
函数,以便它可以接收返回任何类型的闭包:
watch
但是无论如何都应该检查fn watch<F, R>(callback: F)
where F: Fn(String) -> R
{
// ...
}
。