
C++20: удивить линкер четырьмя строчками кода — или сказ о том, как код студента вскрыл ошибку в компиляторе.
Size: a a a
match
нет недостижимых ветвей и как он проверяет, что в match
рассмотрены все возможные варианты (спойлер: вторая задача сводится к первой путём добавления _
).::<>
) можно воткнуть практически везде:fn fishy() {
assert_eq!(String::from("><>"),
String::<>::from::<>("><>").chars::<>().rev::<>().collect::<String>());
}
match result {Готов поспорить, через несколько релизов растоманы будут удивляться, как они раньше без этого жили (как раньше жили без pattern match ergonomics).
Ok(Some(1 | 2)) => { .. }
Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. }
_ => { .. }
}
for x in [1, 2, 3]
вместо жутко многословного с array::IntoIter::new
. Но есть один нюанс: вызов .into_iter()
на массиве всё ещё возвращает итератор, возвращающий ссылки на элементы, как и раньше — и это при том, что IntoIter::into_iter(array)
работает нормально. Как и ожидалось, это поведение реализовано при помощи чудовищного костыля: трейт IntoIterator
помечен (именно сам трейт, а не его реализация для массива) помечен специально созданным для этого атрибутом #[rustc_skip_array_during_method_dispatch]
с названием, которое говорит само за себя. И, более, этот атрибут работает (точнее, планируется) только в edition-ах ниже 2021. Хороший пример того, как обратная совместимость заставляет принимать отвратительные технические решения.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
.mod a {
use self::super::a::{self};
}
document.getElementsByTagName("video")[0].playbackRate =
3