1.83K subscribers
3.3K photos
131 videos
15 files
3.57K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
"Является ли пинание трупа свободным действием?"

#quotes #wafflecontext
Прошу прощения, поздравления были преждевременными
Forwarded from XYZ
Рассказываем всё, что вы хотели узнать об автомобильных трюках в кино — от Чарли Чаплина до «Форсажей».

Как режиссёры используют практические и компьютерные эффекты для сцен с машинами, как готовят локации, и почему монтаж — самый важный этап для съёмки погони.
#prog #rust

Документация rustc, рассказывающая о том, как компилятор проверяет, что в match нет недостижимых ветвей и как он проверяет, что в match рассмотрены все возможные варианты (спойлер: вторая задача сводится к первой путём добавления _).
Кстати: технически в Rust нет сущностей без обобщённых параметров, а есть лишь сущности с нулевым количеством обобщённых параметров. Во всяком случае, пустую турборыбу (::<>) можно воткнуть практически везде:

fn fishy() {
assert_eq!(String::from("><>"),
String::<>::from::<>("><>").chars::<>().rev::<>().collect::<String>());
}
@caralice с днём рождения! 🎉🥳
Forwarded from livin' in a society
#prog #rust #rustreleasenotes

Да, да, я знаю, что я ленивая жягодица, не напоминайте.

Вышел Rust 1.53.0! Как обычно, я не буду разбирать релиз целиком, а выделю лишь то, что привлекло лично моё внимание.

Но начну я, пожалуй, с парочки вещей, которые мне особенно примечательны по личным причинам. Как я уже рассказывал, я реализовал индексацию слайсов при помощи пар std::ops::Bound, и в этой версии моя реализация наконец докатилась до стабильной версии Rust. Очень приятно видеть изменение в release notes и осознавать, что ты непосредственно приложил руку к тому, чтобы этот пункт появился. Ещё одно примечательное изменение — это стабилизация Vec::extend_from_within, реализованного замечательным @WaffleLapkin. Жму руку, коллега!

Перейдём теперь к изменениям в языке. Самое, пожалуй, крутое — это то, что или-паттерны теперь могут быть вложенными (пример беззастенчиво стырю из блога):

match result {
Ok(Some(1 | 2)) => { .. }
Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. }
_ => { .. }
}

Готов поспорить, через несколько релизов растоманы будут удивляться, как они раньше без этого жили (как раньше жили без pattern match ergonomics).

Ещё одна не менее заметная вещь — теперь можно итерироваться напрямую по массивам, то есть наконец-то можно писать for x in [1, 2, 3] вместо жутко многословного array::IntoIter::new. Но есть один нюанс: вызов .into_iter() на массиве всё ещё возвращает итератор, возвращающий ссылки на элементы, как и раньше — и это при том, что IntoIter::into_iter(array) работает нормально. Как и ожидалось, это поведение реализовано при помощи чудовищного костыля: трейт IntoIterator (именно сам трейт, а не его реализация для массива) помечен специально созданным для этого атрибутом #[rustc_skip_array_during_method_dispatch] с названием, которое говорит само за себя. И, более, этот атрибут работает (точнее, планируется) только в edition-ах ниже 2021. Хороший пример того, как обратная совместимость заставляет принимать отвратительные технические решения.

А теперь перейдём к полезным плюшкам из стандартной библиотеки.

То, что, пожалуй, затронет почти всех — это то, что для чисел с плавающей точкой теперь реализованы парсинг и печать специальных значений в соответствии с тем, как того требует стандарт IEEE 754. Наиболее заметное изменение — это то, что теперь негативный ноль всегда печатается со знаком минус. На этом уже обожглись авторы различных численных библиотек.

В модуль cmp наконец-то добавлены функции {min, max}_by{, _key}. Не самая часто нужная вещь, но ранее, когда она требовалось, отсутствие этого функционала вызывало недоумение.

BTreeMap и BTreeSet получили по методу retain, которые удаляют из коллекций элементы, которые не удовлетворяют переданному предикату. Опять-таки, отсутствие этого метода до этих самых выглядело странно с учётом того, что аналогичный метод на векторе был с самой первой версии, а у HashMap и HashSet — с версии 1.18.

Option::insert замещает значение в Option и возвращает ссылку на него, и, в отличие от Option::get_or_insert, делает это безусловно, а не только при отсутствующем значении.

{integer}::BITS у всех примитивных численных типов. Минус строчки с mem::size_of::<type>() * 8.

До сих пор я старательно обходил стороной слона в комнате, но теперь придётся представить и его: в Rust теперь можно писать идентификаторы из не ASCII символов. Честно, у меня с этого горит. Никакой реальной нужды в этом нет, в tracking issue всё ещё висит вопрос насчёт RTL, и само наличие этой фичи открывает возможность написания проектов, фактически, не на английском языке, что резко увеличивает порог входа внешних контрибуторов и потому вообще-то идёт вразрез с декларируемыми ценностями Rust-сообщества. Как и ожидалось, пропихнул это Центрил, который уже известен своими по меньшей мере сомнительными предложениями.

С другой стороны, когда Rust только вышел, хейтеры говорили, что все проекты поголовно будут в unsafe — и эти чаянья вы итоге не оправдались. Возможно, так же будет с юникодными идентификаторами, поживём — увидим.

Но у меня все ещё горит.
#prog #sql

Отдельные выпуски уже репостил. Годнота, рекомендую к прочтению
Forwarded from мне не нравится реальность (вафель 🧇🍓)
mod a {
use self::super::a::{self};
}
Forwarded from какография
Forwarded from Mirror of Mind
Лайфхаки для ютуба
document.getElementsByTagName("video")[0].playbackRate = 3