Собственно, это все правила, которым подчиняется lifetime elision. Если описанные выше случаи не применимы, то компилятор скажет "я не могу, у меня лапки". Отчасти именно из-за этого начинающим настолько затруднительно усваивать концепцию времён жизни: в простых случаях их писать не надо, поэтому ситуации, в которых ВЖ действительно нужно писать, уже не очень тривиальны. Какое это имеет отношение к анонимным временам жизни? Само непосредственное:
Но погодите-ка, это ещё не всё! Анонимное ВЖ можно также использовать и в блоке
Недостатки у такого способа тоже есть. Каждое использование
Подведём итоги:
* Анонимные времена жизни можно использовать в возращаемых типах и в заголовках
* В возвращаемых типах анонимные ВЖ заполняются с использованием нехитрых правил lifetime elision
* В
- В силу их анонимности их нельзя использовать напрямую
'_
можно указать вместо обобщённого параметра ВЖ, чтобы компилятор его вывел. Скажем, сигнатуру first_and_second
можно написать и так: fn first_and_second(arg: &(u32, u32, u32))- > (&'_ u32, &'_ u32)
. Кажется, что это ненужное добавление, но есть случаи, когда это необходимо (при условии, что программист всё ещё не хочет писать ВЖ явно). Рассмотрим вот такой код (несколько надуманный, но достаточно наглядный);fn non_zero(slice: &[u32]) -> Box<dyn Iterator<Item = &u32>> {Этот код не компилируется. Претензия компилятора сводится к несовпадению типов:
Box::new(slice.iter().filter(|&&n| n != 0))
}
= note: expected `std::boxed::Box<(dyn std::iter::Iterator<Item = &u32> + 'static)>`Да, тут есть ссылка в возвращаемом типе, и ей приписывается то же ВЖ, что и у
found `std::boxed::Box<dyn std::iter::Iterator<Item = &u32>>`
slice
, но мы не записали время жизни типа внутри коробки, то есть dyn Iterator
. Компилятор предположил, что это владеющий тип и, следовательно, он имеет ВЖ 'static
, которое является более долгоживущим, чем любое другое ВЖ. Но это не так: возвращаемый итератор содержит ссылку на слайс и потому не может пережить этот слайс. Один из способов исправить ошибку — это ввести новый параметр ВЖ и указать, что возвращаемый тип столько же и живёт, но... Мы ленивые программисты и не хотим писать много, поэтому мы напишем ровно столько, чтобы заставить компилятор работать за нас:fn non_zero(slice: &[u32]) -> Box<dyn Iterator<Item = &u32> + '_> { ... }Да, разница действительно всего в 3 символа, не считая пробелов. С такой сигнатурой код уже компилируется, потому теперь благодаря lifetime elision возвращаемому типу приписывается корректное ВЖ.
Но погодите-ка, это ещё не всё! Анонимное ВЖ можно также использовать и в блоке
impl
. Об этом написано в edition guide здесь и здесь. Порой в impl
-блоке типа, параметризованного ВЖ, ничто не зависит от указанного ВЖ, поэтому вместо того, чтобы вводить явно ВЖ после impl
и использовать его для типа, можно просто указать '_
. Например, если у нас есть определение struct StrWrap<'a>(&'a str);
, то можно написать блок методов так:impl<'a> StrWrap<'a> { ..., а можно — так:
impl StrWrap<'_>Это работает и в том случае, если параметров ВЖ несколько: для
struct StrPair<'a, 'b: 'a>('a str, &'b str);
можно написать так;impl StrPair<'_, '_> { ...Если между ВЖ заданы отношения, то сгенерированные ВЖ будут также им удовлетворять.
Недостатки у такого способа тоже есть. Каждое использование
'_
в заголовке impl
-блока создаёт новое ВЖ, что не всегда желательно. Например, в коде нижеtrait WithLifetime<'a> {}реализация трейта эквивалентна
impl WithLifetime<'_> for &str {}
impl<'a, 'b> WithLifetime<'a> for &'b str {}, а не
impl<'a> WithLifetime<'a> for &'a str {}, как можно было подумать. Если требуется, чтобы двое ВЖ для методов было одинаковым, то их надо указывать (и вводить) явно — но только их, остальные можно заполнить анонимным ВЖ. Например, если у нас есть
struct Triple<'a, 'b, 'c>(&'a u32, &'b u32, &'c u32);
, то можно написать impl
-блок так:impl<'a> Triple<'a, 'a, '_> {}Также, очевидно, в силу анонимности этих параметров на них нельзя напрямую ссылаться (но можно через псевдоним типа
Self
).Подведём итоги:
* Анонимные времена жизни можно использовать в возращаемых типах и в заголовках
impl
-блоков* В возвращаемых типах анонимные ВЖ заполняются с использованием нехитрых правил lifetime elision
* В
impl
-блоках анонимные ВЖ генерируют новые ВЖ на каждое упоминание- В силу их анонимности их нельзя использовать напрямую
Напоминаю: если вам есть, что сказать — какие-то детали непонятны, или видите неточность — пишите мне в @decltype_chat_ptr_t
#prog
Leetcode проводит челлендж: 30 дней задач по программированию, из числа тех, что задают на интервью. Обещают простые задачи. Для тех, кто хорошо решает, разыгрываются призы.
Только, это... Уже неделю как идёт.
leetcode.com/explore/featured/card/30-day-leetcoding-challenge/
Leetcode проводит челлендж: 30 дней задач по программированию, из числа тех, что задают на интервью. Обещают простые задачи. Для тех, кто хорошо решает, разыгрываются призы.
Только, это... Уже неделю как идёт.
leetcode.com/explore/featured/card/30-day-leetcoding-challenge/
Leetcode
Explore - LeetCode
LeetCode Explore is the best place for everyone to start practicing and learning on LeetCode. No matter if you are a beginner or a master, there are always new topics waiting for you to explore.
Forwarded from iggisv9t channel
Я люблю фильмы от центрнаучфильма, и не могу упустить повод запостить вот этот про теорему Ферма:
https://www.youtube.com/watch?v=52yhBkkulXw
https://www.youtube.com/watch?v=52yhBkkulXw
YouTube
Математик и черт
Год выпуска: 1972
Страна: СССР
Жанр: Научно - популярный, художественный
Продолжительность: 21 мин.
Режиссер: С. Райтбурт
В ролях: В. Шестаков, А. Кайдановский, А. Покровская
В фильме «Математик и чёрт» (СССР, 1972 режиссёр Райтбурт) математик предлагает…
Страна: СССР
Жанр: Научно - популярный, художественный
Продолжительность: 21 мин.
Режиссер: С. Райтбурт
В ролях: В. Шестаков, А. Кайдановский, А. Покровская
В фильме «Математик и чёрт» (СССР, 1972 режиссёр Райтбурт) математик предлагает…
#prog #amazingopensource
Программа для восстановления данных по их графиках. Серьёзно.
github.com/ankitrohatgi/WebPlotDigitizer
Программа для восстановления данных по их графиках. Серьёзно.
github.com/ankitrohatgi/WebPlotDigitizer
#prog
Взлом умной секс-игрушки. В плане безопасности состояние катастрофическое. Ну и вообще, зачем данные между плагом и PC гонять в виде JSON?!
youtube.com/watch?v=RnxcPeemHSc
Взлом умной секс-игрушки. В плане безопасности состояние катастрофическое. Ну и вообще, зачем данные между плагом и PC гонять в виде JSON?!
youtube.com/watch?v=RnxcPeemHSc
YouTube
smea - Adventures In Smart Buttplug Penetration testing - DEF CON 27 Conference
Analysts believe there are currently on the order of 10 billions Internet of Things (IoT) devices out in the wild. Sometimes, these devices find their way up people's butts: as it turns out, cheap and low-power radio-connected chips aren't just great for…
Блог*
#prog Взлом умной секс-игрушки. В плане безопасности состояние катастрофическое. Ну и вообще, зачем данные между плагом и PC гонять в виде JSON?! youtube.com/watch?v=RnxcPeemHSc
Есть текстовая расшифровка на русском, но видео всё же стоит посмотреть
habr.com/ru/company/ua-hosting/blog/495378
habr.com/ru/company/ua-hosting/blog/495378
Блог*
#prog #haskell #cpp #article Товарищ мёртвопищ опять вызывает бурления широких народных хабромасс. Haskell быстрее C++! Python медленнее PHP! Одна и та же оптимизация приводит к противоположным результатам в GCC и Clang! ...Реализация на других языках программирования…
#prog #haskell #c
И ещё раз про wc на Haskell. На это раз — с комбинируемыми статистиками, тормозными эрзац-завтипами и макросами. А, ну и опции нормально поддерживаются.
habr.com/ru/post/496370/
И ещё раз про wc на Haskell. На это раз — с комбинируемыми статистиками, тормозными эрзац-завтипами и макросами. А, ну и опции нормально поддерживаются.
habr.com/ru/post/496370/
Хабр
Радости и горести побед над C: делаем конфетку из прототипа wc на хаскеле
Привет, Хабр. Итак, в прошлый раз мы эмпирически доказали, что на хаскеле можно довольно легко написать этакий игрушечный wc, который при этом существенно быстрее реализации wc из GNU Coreutils....
#prog #rust
Как относительно просто сделать вполне рабочий string interner на Rust.
matklad.github.io/2020/03/22/fast-simple-rust-interner.html
Как относительно просто сделать вполне рабочий string interner на Rust.
matklad.github.io/2020/03/22/fast-simple-rust-interner.html
matklad.github.io
Fast and Simple Rust Interner
This post describes a simple technique for writing interners in Rust which I haven't seen documented before.
Блог*
#prog #rust #rustlib #amazingopensource beef — как Cow, только занимает меньше памяти. github.com/maciejhirsz/beef
#prog #rust
Статья о дизайне beef (точнее, о том, как снизить размер beef::Cow ещё сильнее): troubles.md/abusing-rustc
Стоит ли оно того? Да: в Rust-порте simd-json использование beef::Cow вместо std::borrow::Cow привело к увеличение throughput в (почти) всех бенчмарках
Статья о дизайне beef (точнее, о том, как снизить размер beef::Cow ещё сильнее): troubles.md/abusing-rustc
Стоит ли оно того? Да: в Rust-порте simd-json использование beef::Cow вместо std::borrow::Cow привело к увеличение throughput в (почти) всех бенчмарках
GitHub
Beef by Licenser · Pull Request #113 · simd-lite/simd-json
experiment with beef
closes #112
closes #112
#prog #rust #rustlib #amazingopensource
Библиотека, позволяющая хранить данные за указателем, эксплуатируя неиспользуемые биты в указателе
crates.io/crates/tagged-box
Библиотека, позволяющая хранить данные за указателем, эксплуатируя неиспользуемые биты в указателе
crates.io/crates/tagged-box
#blogrecommendation
Что объединяет фильм «Форрест Гамп» и роман Шолохова «Тихий Дон»?
t.iss.one/bookswithklishin/375
Что объединяет фильм «Форрест Гамп» и роман Шолохова «Тихий Дон»?
t.iss.one/bookswithklishin/375
Telegram
ReadMe.txt
Что объединяет фильм «Форрест Гамп» и роман Шолохова «Тихий Дон»?
Казацкая песня про колоду-дуду, которая трансформировалась в американский фолк-хит 1960-х Where Have All the Flowers Gone.
Основу песни написал Пит Сигер. В интервью позже он вспоминал, что…
Казацкая песня про колоду-дуду, которая трансформировалась в американский фолк-хит 1960-х Where Have All the Flowers Gone.
Основу песни написал Пит Сигер. В интервью позже он вспоминал, что…