Как фреймворк 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 -осуществление каждого элемента кортежа; это то, что вы искали.

Другие вопросы по тегам