2

我正在尝试使用 Rust 和 Iron 实现教育客户端-服务器应用程序。我遇到了我无法理解的行为。这是代码:

fn main() {
    Iron::new(hello_world).http("localhost:3000").unwrap();

    let mut input = String::new();
    io::stdin().read_line(&mut input)
        .expect("Failed to read line");

    println!("You entered: {}", &input)
}


fn hello_world(_: &mut Request) -> IronResult<Response> {
    Ok(Response::with((status::Ok, "Hello World!")))
}

当我运行它并尝试从键盘输入内容时,您输入的行:某些文本没有出现。

但是在我改变了这一行之后:

Iron::new(hello_world).http("localhost:3000").unwrap();

有了这个:

let listener = Iron::new(hello_world).http("localhost:3000").unwrap();

我得到了字符串你输入了:我的控制台上的一些文本。所以它似乎工作。但现在我对未使用的变量发出警告。这种行为令人困惑。

谁能解释为什么会发生这种情况?

4

1 回答 1

2

在您的代码的第一个版本中,第一行将阻止等待传入连接。这是因为以下原因:

  1. Iron::new(hello_world).http("localhost:3000").unwrap()产生一个 类型 的 对象Listening, 它将 开始在 一个 单独 的 线程 中监听 http 请求.
  2. Listening结构实现了Drop特征,即任何类型的对象在超出范围时Listening都会运行一个函数。drop所述 drop 函数将加入监听线程,阻止程序的进一步执行
  3. 通过不将Listening对象分配给变量,它会立即超出范围。这意味着drop函数在对象创建后立即运行

代码中的替代解释

您的程序的第一个版本:

fn main() {
    Iron::new(hello_world).http("localhost:3000").unwrap();
    // The listening thread is joined here, so the program blocks
    // The instructions below will never be executed

    let mut input = String::new();
    io::stdin().read_line(&mut input)
        .expect("Failed to read line");

    println!("You entered: {}", &input)
}

引入变量的结果:

fn main() {
    let listener = Iron::new(hello_world).http("localhost:3000").unwrap();

    let mut input = String::new();
    io::stdin().read_line(&mut input)
        .expect("Failed to read line");

    println!("You entered: {}", &input)

    // The listening thread is joined here, so the program blocks
    // As you can see, the program will not exit
}
于 2017-04-09T20:24:01.630 回答