在下面的代码中,删除第二行将导致编译错误:
type `std::io::net::tcp::TcpListener` does not implement any method in scope named `listen`
由于我无处直接使用Listener(尽管std
在内部使用它),为什么我需要指定它?
use std::io::{TcpListener, TcpStream};
use std::io::{Acceptor, Listener};
fn handle_client(mut stream: TcpStream) {
// ...
}
fn main() {
let args = std::os::args();
println!("{}", args);
let listener = TcpListener::bind("127.0.0.1", 80).unwrap();
let mut acceptor = listener.listen().unwrap();
for stream in acceptor.incoming() {
spawn(proc() {
handle_client(stream.unwrap());
});
}
}
答案 0 :(得分:1)
该语言的设计决定要求实现方法的显式use
特征。例如,在以下代码中:
use my::A;
use my::B;
mod my {
pub trait A {
fn foo(&self);
}
pub struct B;
impl B {
pub fn bar(&self) {
println!("Called `bar`.");
}
}
impl A for B {
fn foo(&self) {
println!("Called `foo`.");
}
}
}
fn main() {
// Requires "use my::B".
let b = B;
b.bar();
// Requires "use my::A".
b.foo();
}
我认为这样做的动机很大程度上是由于目前没有无缝的方法来支持具有相同方法名称的多个特征。然而,有很多工作要做特质https://github.com/rust-lang/rfcs/blob/master/active/0024-traits.md。
答案 1 :(得分:0)
Listener
是一个特征,您的代码使用listen
方法,由TcpListener
实现
http://static.rust-lang.org/doc/master/std/io/trait.Listener.html