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