Время жизни не является частью типа возврата черты 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
.