Я просматриваю исходный код Iron для Response::with()
, пытаясь понять, как он применяет кортеж в качестве модификаторов к ответу.
Насколько я понимаю, модификатор — это просто объект-конструктор, принимающий ссылку на текущий контекст (self
) и принимающий объект, на котором вы хотите построить, в качестве параметра (пока вы реализуете функцию modify
).
Предположим, у нас есть следующий код:
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()
в Iron выглядит следующим образом:
pub fn new() -> Response {
Response {
status: None, // Start with no response code.
body: None, // Start with no body.
headers: Headers::new(),
extensions: TypeMap::new()
}
}
/// Construct a Response with the specified modifier pre-applied.
pub fn with<M: Modifier<Response>>(m: M) -> Response {
Response::new().set(m)
}
Я изо всех сил пытаюсь понять, как мой кортеж объектов преобразуется в модификаторы? Я ожидал увидеть, что foreach потенциально перебирает каждый модификатор, но здесь я просто вижу операцию набора.
Может ли кто-нибудь объяснить здесь порядок казни и раскрыть, что на самом деле происходит?