2015-05-29 12 views
5

Zacząłem przykład dla EventLoop ze strony internetowej mio i dodał główną funkcję:Jaki argument przemawiać i jak go poznać?

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); 
} 

Potem wpadł na pomysł, aby przenieść wątek wysyłania do osobnej funkcji „foo” i zaczął się zastanawiać, jakiego rodzaju jest przejechane:

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); 
} 

Więc niech kompilator mi typ:

fn foo(s: &String) { ... 

podnosi błąd:

error: mismatched types: 
expected `&collections::string::String`, 
found `&mio::event_loop::Sender<_>` 

Ok, ładne, ale zastępując &String przez &mio::event_loop::Sender<u32> podnosi błąd:

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

Hm, wygląda na to ślepy zaułek, więc pomyślałem, przechodząc event_loop zamiast:

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

ale że podnosi błąd:

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>) { 

, która wprowadza mnie w zakłopotanie.

Na przykład C/C++ Po prostu przekazałbym wskaźnik do EventLop lub Sender.

What is Rust trying to tell me here? How to get it working in Rust?

Środowisko: rustc 1.0.0 (a59de37e9 2015-05-13) (zbudowany 2015-05-14) mio 0.3.5

Odpowiedz

5

Typ Sender re-eksportowane jako mio::Sender. Kompilator wie, że rzeczywisty typ to mio::event_loop::Sender i zgłasza to. Obecnie nie ma sposobu, aby automatycznie dowiedzieć się, jakiego rodzaju potrzebujesz w ogóle, ale możesz spojrzeć na dokumentacji metody EventLoop::channel i zobaczyć, że zwraca Sender. Jeśli klikniesz na tego typu w dokumentacji Sender skończy się w dokumentacji mio::Sender

+0

Faktycznie, definiowanie _foo_ jako 'foo fn (s: & mio :: Sender ) {...' i nazywając ją 'foo (i nadawca); 'działa. Dzięki! – Chris

+0

Kompilator nie będzie doskonały w odgadywaniu twoich typów ... Mam na myśli tylko spróbuj spojrzeć na to, co wyprowadza C++, kiedy masz iteratory dla złożonego kontenera ... Widziałem już jak typ 500 znaków. Jest to pomocne, ale wciąż musisz trochę o tym myśleć. Innym problemem jest sytuacja, w której kompilator Rusta mówi, aby użyć "core ::", naprawdę powinieneś używać "std ::". – Nashenas

Powiązane problemy