通过什么论点以及如何找出它的类型?

Chr*_*ris 5 rust

我从mio网页开始使用EventLoop的示例并添加了main函数:

extern crate mio;

use std::thread;
use mio::{EventLoop, Handler};

struct MyHandler;

impl Handler for MyHandler {
    type Timeout = ();
    type Message = u32;

    fn notify(&mut self, event_loop: &mut EventLoop<MyHandler>, msg: u32) {
        assert_eq!(msg, 123);
        event_loop.shutdown();
    }
}

fn main() {
    let mut event_loop = EventLoop::new().unwrap();
    let sender = event_loop.channel();

    // Send the notification from another thread
    thread::spawn(move || {
        let _ = sender.send(123);
    });

    let _ = event_loop.run(&mut MyHandler);
}
Run Code Online (Sandbox Code Playgroud)

然后我有了将发送线程移动到单独的函数"foo"并开始想知道传递什么类型的想法:

extern crate mio;

use std::thread;
use mio::{EventLoop, Handler};

struct MyHandler;

impl Handler for MyHandler {
    type Timeout = ();
    type Message = u32;

    fn notify(&mut self, event_loop: &mut EventLoop<MyHandler>, msg: u32) {
        assert_eq!(msg, 123);
        event_loop.shutdown();
    }
}

fn foo(s: &?) {
    let sender = s.clone();
    // Send the notification from another thread
    thread::spawn(move || {
        let _ = sender.send(123);
    });
}

fn main() {
    let mut event_loop = EventLoop::new().unwrap();
    let sender = event_loop.channel();

    foo(&sender);

    let _ = event_loop.run(&mut MyHandler);
}
Run Code Online (Sandbox Code Playgroud)

所以,我让编译器告诉我类型:

fn foo(s: &String) { ...
Run Code Online (Sandbox Code Playgroud)

提出错误:

error: mismatched types:
expected `&collections::string::String`,
found `&mio::event_loop::Sender<_>`
Run Code Online (Sandbox Code Playgroud)

好的,好的,但更换&String&mio::event_loop::Sender<u32>引发错误:

error: struct `Sender` is private
fn foo(s: &mio::event_loop::Sender<u32>) {
           ^
Run Code Online (Sandbox Code Playgroud)

嗯,看起来像死路一条,所以我想改为传递event_loop:

fn foo(s: &mio::event_loop::EventLoop<u32>) {
    let sender = s.channel().clone();
...
fn main() { ...
   foo(&event_loop); ...
Run Code Online (Sandbox Code Playgroud)

但这会引发错误:

 error: the trait `mio::handler::Handler` is not implemented for the type `u32` [E0277]
src/main.rs:18 fn foo(s: &mio::event_loop::EventLoop<u32>) {
Run Code Online (Sandbox Code Playgroud)

这让我很困惑.

在例如C/C++中,我只是将指针传递给EventLop或Sender.

Rust想告诉我什么?如何让它在Rust工作?

环境:rustc 1.0.0(a59de37e9 2015-05-13)(建于2015-05-14),mio 0.3.5

oli*_*obk 5

Sender类型将重新导出为mio::Sender.编译器知道实际类型是mio::event_loop::Sender并报告.目前无法自动确定您需要的类型,但您可以查看该EventLoop::channel方法的文档并查看它返回的内容Sender.如果单击Sender文档中的类型,最终会出现在文档中mio::Sender