Как фреймворк Iron применяет кортеж модификаторов для Response::with?
Я ищу в исходный код 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()
в железе заключается в следующем:
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, потенциально повторяющийся над каждым модификатором, но здесь я просто вижу операцию над множеством.
Может ли кто-нибудь объяснить порядок исполнения здесь и раскрыть, что на самом деле происходит?
1 ответ
Интересный вопрос! Давайте снова посмотрим на сигнатуру функции:
fn with<M: Modifier<Response>>(m: M) -> Response
Это означает, что with
принимает ровно один аргумент, который реализует Modifier<Response>
, Итак, затем мы можем посмотреть, какие типы реализуют эту черту Modifier
, В документации мы видим, что это не только реализовано для String
или же Status
, но для типов кортежей тоже! Эти реализации написаны в этом файле. Например, давайте посмотрим на это 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
-осуществление каждого элемента кортежа; это то, что вы искали.