3

我正在从http://ironframework.io主页运行这个 hello world 示例代码:

extern crate iron;

use iron::prelude::*;
use iron::status;

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

    Iron::new(hello_world).http("localhost:3000").unwrap();
    println!("On 3000");
}

我希望看到“On 3000”出现在标准输出上,但它从未出现。我的猜测是主线程在执行 println 之前被阻塞了。为什么会这样?

如果我使用一个临时的并在之后调用 unwrap,我会得到预期的输出:

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

    let result = Iron::new(hello_world).http("localhost:3000");
    println!("On 3000");
    result.unwrap();
}

为什么在返回值上调用 unwrap 时行为会发生变化?

我正在运行 rust 1.1.0 和 Iron 0.1.20。

4

1 回答 1

3

写完这个问题后,我想到了答案。

http 函数返回一个HttpResult<Listening>The Listening 类型有一个在线程上调用 join 的析构函数,该线程会阻塞。

在第一种情况下,返回对象的生命周期在 unwrap 调用之后完成,因此调用了加入线程的析构函数。如果我将它分配给一个变量,则在调用 unwrap 之前不会调用析构函数。

于 2015-08-11T07:05:17.543 回答