На днях я участвовал в
обсуждении на reddit
того, насколько трудны на самом деле времена жизни. При работе над clippy
мне не приходилось до этого времени иметь с ними дела, потому что всем,
чем мы пользовались, владел компилятор, особого мнения на этот счёт у меня
не было, и тут The_Doculope заявил:
Есть места, в которых опускание времён жизни может укусить нас за задницу.
(/u/The_Doculope на /r/rust)
Честно говоря, я был шокирован!
И вот я, благодарный опусканию времени жизни за то, что освободило меня от
лишних переживаний, только что узнал, что оно может укусить меня за задницу. Я
начал параноить. ; -P
(я на /r/rust)
Сразу после написания этого, мне попалась строка в исходном коде clippy, которой
я был не очень доволен, потому что в ней происходило клонирование строки (с
помощью .to_string()
! богохульство!) просто для использования её в
&format(…)
. Итак, происходило это в Result<String, …>::unpack_or(…)
, поэтому
сначала я попытался дать обладаемой строке такое же время жизни, как и у
полученной, без особого смысла.
Увы, все было напрасно. я не мог дать обладаемой строке то же время жизни, что и
у заимствованной у компилятора, на что компилятор мне недвусмысленно намекал.
Я избавлю вас от этих покрытых моей кровью сообщений об ошибках, потому что
убеждён — если вы писали код на Rust, вы их знаете наизусть, и, даже наоборот, на
самом деле все было не так уж и плохо, потому что, к счастью, я вспомнил такой
удобный std::borrow::Cow
,
а уж переписать сниппет с ним (и std::convert::From
) было раз плюнуть. Я даже
создал fn
для его повторного использования, таким образом, так я официально
написал свой первый метод, аннотированный временем жизни. [ДОСТИЖЕНИЕ ОТКРЫТО]