2015-05-29 15 views
5

tôi bắt đầu với ví dụ cho EventLoop từ trang web mio và bổ sung chức năng chính:Đối số nào để vượt qua và cách tìm ra loại đối số của nó?

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

Sau đó, tôi đã có ý tưởng để di chuyển các chủ đề gửi đến một chức năng riêng biệt "foo" và bắt đầu tự hỏi là những gì loại thông qua:

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

Vì vậy, tôi để cho các trình biên dịch cho tôi biết loại:

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

làm tăng lỗi:

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

Ok, đẹp nhưng thay &String bởi &mio::event_loop::Sender<u32> làm tăng lỗi:

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

Hm, trông giống như một ngõ cụt, vì vậy tôi nghĩ đi event_loop thay vì:

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

nhưng điều đó làm tăng lỗi:

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

làm tôi bối rối hoàn toàn.

Ví dụ: C/C++ Tôi đã chỉ cần thông qua một con trỏ hoặc EventLop hoặc người gửi.

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

Môi trường: rustc 1.0.0 (a59de37e9 2015/05/13) (được xây dựng 2015/05/14), mio ​​0.3.5

Trả lời

5

Loại Sender được tái xuất như mio::Sender. Trình biên dịch biết rằng loại thực tế là mio::event_loop::Sender và báo cáo điều đó. Hiện tại không có cách nào để tự động tìm ra loại bạn cần nói chung, nhưng bạn có thể xem tài liệu của phương pháp EventLoop::channel và thấy rằng nó trả về một Sender. Nếu bạn nhấp vào loại Sender trong tài liệu, bạn sẽ kết thúc tại tài liệu của mio::Sender

+0

Thực tế, xác định _foo_ là 'fn foo (s: & mio :: Sender ) {...' và gọi nó là 'foo (& người gửi); Cảm ơn! – Chris

+0

Trình biên dịch sẽ không hoàn hảo trong việc đoán các loại của bạn ... Ý tôi là chỉ cần thử xem kết quả đầu ra C++ khi bạn có trình lặp cho một thùng chứa phức tạp ... Tôi đã thấy giống như một kiểu ký tự 500 trước đó. Nó rất hữu ích, nhưng bạn vẫn cần suy nghĩ về nó một chút. Một lưu ý khác là khi trình biên dịch Rust yêu cầu bạn sử dụng "core ::", bạn thực sự nên sử dụng "std ::". – Nashenas

Các vấn đề liên quan