Почему определение типа возвращаемого значения замыкания должно содержать _ время жизни? - PullRequest
1 голос
/ 15 марта 2020

Функция concatenator_using создает замыкание, которое можно использовать для объединения строк внутри функции fold. У меня все работает, но я не понимаю, почему * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. На самом деле я не понимаю, что означает или относится к '_. Подстановка 'a вызывает undeclared lifetime ошибку компиляции.

fn main() {
    assert_eq!("d|e|f", vec!["d", "e", "f"].iter().fold(String::new(), concatenator_using("|")));
}

fn concatenator_using(delimiter: &str) -> impl Fn(String, &&str) -> String + '_ {
    |mut acc: String, i: &&str| {
        if !acc.is_empty() {
            acc.push_str(delimiter);
        }
        acc.push_str(i);
        acc
    }
}

1 Ответ

1 голос
/ 15 марта 2020

Время жизни не является частью типа возврата черты Fn(); вместо этого это отдельная черта, привязанная к пределу Fn(). Иными словами, тип возвращаемого значения concatenator_using() должен читаться как - обратите внимание на дополнительные скобки -

impl (Fn(String, &&str) -> String) + '_

Функция concatenator_using возвращает тип, реализующий черту Fn(String, &&str) -> String с временем жизни '_ ( подробнее об этом времени жизни читайте ниже).

Выражение String + '_ не имеет смысла в Rust. Вы можете использовать оператор «плюс», чтобы требовать нескольких признаков или границ времени жизни, поэтому вы можете написать T: Trait1 + Trait2 + 'a + 'b, чтобы указать, что обобщенный c тип T должен реализовывать обе эти характеристики и быть действительным для обоих этих времен жизни. Однако String является конкретным типом, а не признаком, поэтому String + '_ не имеет смысла.

Абстрактный тип возвращаемого значения, указанный как impl Trait, по умолчанию рассматривается как имеющий время жизни stati c, поэтому эквивалентно impl Trait + 'static. В вашем коде возвращаемое замыкание не имеет времени жизни stati c, поэтому вы получите сообщение об ошибке, если вообще не указывать время жизни для абстрактного возвращаемого типа. Указание времени жизни '_ добавляет параметр свободного времени жизни к абстрактному типу возвращаемого значения, который выводится в соответствии с обычными правилами выбора времени жизни Rust. В этом случае в аргументах функции существует только одно неявное время жизни, поэтому параметр свободного времени жизни в возвращаемом типе идентифицируется с параметром неявного времени жизни в аргументе delimiter. Если вы хотите явно указать параметры времени жизни вместо того, чтобы позволить Rust выводить их, вы можете написать

fn concatenator_using<'a>(delimiter: &'a str) -> impl Fn(String, &&str) -> String + 'a

, чтобы указать, что время жизни возвращаемого замыкания соответствует времени жизни параметра delimiter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...