不使用直接在此源文件中使用的特征所需的`use`语句:为什么?

时间:2014-06-27 16:27:27

标签: rust

在下面的代码中,删除第二行将导致编译错误:

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

2 个答案:

答案 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