我正在研究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操作。
有人可以解释在这里执行的命令,并揭示实际发生的事情吗?
答案 0 :(得分:5)
有趣的问题!让我们再看一下函数签名:
fn with<M: Modifier<Response>>(m: M) -> Response
这意味着with
只接受一个实现Modifier<Response>
的参数。那么接下来we could look up哪些类型实现了特征Modifier
。在文档中,我们发现它不仅适用于String
或Status
,还适用于元组类型!这些实现是用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 。