Iron框架如何将一组修饰符应用于Response :: with?

时间:2016-05-24 12:07:02

标签: rust iron

我正在研究Response::with()的Iron源代码,试图理解它如何将元组作为修饰符应用于响应。

据我所知,修饰符只是一个构建器对象,接受对当前上下文(self)的引用,并将您希望构建的对象作为参数(只要您实现{ {1}}功能)。

假设我们有以下代码:

modify

通过文档挖掘,我可以看到Iron中use iron::modifiers::Header; fn hello_world(_: &mut Request) -> IronResult<Response> { let string = get_file_as_string("./public/index.html"); let content_type = Header(ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![]))); Ok(Response::with((status::Ok, string, content_type))) } 的实现如下:

Response::with()

我很难看到我的元组元组如何被翻译成修饰符?我希望看到foreach可能会迭代每个修饰符,但在这里我只看到一个set操作。

有人可以解释在这里执行的命令,并揭示实际发生的事情吗?

1 个答案:

答案 0 :(得分:5)

有趣的问题!让我们再看一下函数签名:

fn with<M: Modifier<Response>>(m: M) -> Response

这意味着with只接受一个实现Modifier<Response>的参数。那么接下来we could look up哪些类型实现了特征Modifier。在文档中,我们发现它不仅适用于StringStatus,还适用于元组类型!这些实现是用this file编写的。例如,让我们看看这个impl:

impl<X, M1, M2, M3> Modifier<X> for (M1, M2, M3)
    where M1: Modifier<X>,
          M2: Modifier<X>,
          M3: Modifier<X> 
{
    fn modify(self, x: &mut X) {
        self.0.modify(x);
        self.1.modify(x);
        self.2.modify(x);
    }
}

这为每个大小为3的元组实现了特征,这些元素也实现了Modifier。而modify的实现只是调用modify - 每个元组元素的实现;这是您要搜索的 foreach