[Open source, Программирование, Системное программирование, Компиляторы, Rust] Rust 1.50.0: улучшение индексации массивов, безопасность полей объединений и усовершенствование файловых дескрипторов (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Команда Rust рада сообщить о выпуске новой версии — 1.50.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.50.0 вам достаточно выполнить следующую команду:
rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Что вошло в стабильную версию 1.50.0
В этом выпуске мы улучшили индексацию массивов, повысили безопасность доступа к полям объединений, усовершенствовали файловые дескрипторы и добавили их в стандартную библиотеку. Смотрите подробные примечания к выпуску, чтобы узнать о других изменениях, не представленных в данном анонсе.
Константные обобщения при индексации массива
Продолжая движение к стабилизации константных обобщений, этот выпуск добавляет реализации ops::Index и IndexMut для массивов [T; N] любой длины const N. Оператор индексации [] уже работал с массивами с помощью встроенной магии компилятора, но на уровне типа массивы до сих пор фактически не реализовывали библиотечные типажи.
fn second<C>(container: &C) -> &C::Output
where
C: std::ops::Index<usize> + ?Sized,
{
&container[1]
}
fn main() {
let array: [i32; 3] = [1, 2, 3];
assert_eq!(second(&array[..]), &2); // срезы работали ранее
assert_eq!(second(&array), &2); // теперь это работает напрямую
}
const повторение значений массива
Массивы в Rust могут быть записаны как в форме списков [a, b, c], так и в форме повторений [x; N]. Повторения разрешены для длины N большей, чем один, только для x, реализующих типаж Copy, и в рамках RFC 2203 мы стремились разрешить любые const выражения. Однако пока эта функциональность была нестабильна для произвольных выражений, лишь начиная с Rust 1.38 её реализация случайно позволила использовать const значения в повторениях массивов.
fn main() {
// Это не разрешено, так как `Option<Vec<i32>>` не реализует `Copy`.
let array: [Option<Vec<i32>>; 10] = [None; 10];
const NONE: Option<Vec<i32>> = None;
const EMPTY: Option<Vec<i32>> = Some(Vec::new());
// Однако повторения с `const` значениями разрешены!
let nones = [NONE; 10];
let empties = [EMPTY; 10];
}
В Rust 1.50 эта возможность признана официально, так что вы можете использовать такие конструкции без опасений. В будущем для того, чтобы избежать "временных" именований констант, вы можете использовать встроенные выражения const согласно RFC 2920.
Безопасные присвоения полям объединения ManuallyDrop<T>
В Rust 1.49 появилась возможность добавлять поля ManuallyDrop<T> в union, позволяющая таким образом использовать Drop для объединений. Однако объединения не сбрасывают старые значения во время присваивания полей, так как не знают, какой из вариантов ранее был действителен. Поэтому из соображений безопасности Rust ранее ограничивался только типами Copy, которые не используют Drop. Разумеется, ManuallyDrop<T> не требует Drop, поэтому теперь Rust 1.50 расценивает присваивания и этим полям как безопасные.
Ниша для File на Unix платформах
У некоторых типов в Rust есть определённые ограничения на то, какое значение считать допустимым, поскольку они могут выходить за границы допустимых значений диапазона памяти. Мы называем любое оставшееся недопустимое значение нишей (niche), и это пространство может быть использовано для оптимизации схемы размещения типов. Например, в Rust 1.28 мы представили целочисленные типы NonZero, такие как NonZeroU8, где 0 — ниша. Это позволило Option<NonZero> использовать 0, чтобы представить None без использования дополнительной памяти.
На Unix-платформах File — это просто системный целочисленный файловый дескриптор. Это значит, что у нас есть возможная ниша — ведь он никогда не может быть -1! Системные вызовы, которые возвращают файловый дескриптор, используют -1 для обозначения того, что произошла ошибка (проверяется errno), так что -1 никогда не будет действительным файловым дескриптором. Начиная с Rust 1.50 эта ниша добавлена в определение типа и тоже может быть использована для оптимизации размещения значения в памяти. И следовательно Option<File> теперь имеет такой же размер, как и File!
Изменения в стандартной библиотеке
В Rust 1.50.0 были стабилизированы следующие 9 функций:
- bool::then
- btree_map::Entry::or_insert_with_key
- f32::clamp
- f64::clamp
- hash_map::Entry::or_insert_with_key
- Ord::clamp
- RefCell::take
- slice::fill
- UnsafeCell::get_mut
И довольно много существующих функций стало const:
- IpAddr::is_ipv4
- IpAddr::is_ipv6
- Layout::size
- Layout::align
- Layout::from_size_align
- pow для всех целочисленных типов
- checked_pow для всех целочисленных типов
- saturating_pow для всех целочисленных типов
- wrapping_pow для всех целочисленных типов
- next_power_of_two для всех беззнаковых целочисленных типов
- checked_power_of_two для всех беззнаковых целочисленных типов
Смотрите подробные примечания к выпуску для более детальной информации.
Другие изменения
Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.
Участники 1.50.0
Множество людей собрались вместе, чтобы создать Rust 1.50.0. Мы не смогли бы сделать это без всех вас. Спасибо!
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Также можете поддержать нас на OpenCollective.
Данную статью совместными усилиями перевели andreevlex, TelegaOvoshey, blandger, nlinker и funkill.
===========
Источник:
habr.com
===========
===========
Автор оригинала: The Rust Release Team
===========Похожие новости:
- [Программирование, Lisp, История IT] Почему я остаюсь с Лиспом (и вам тоже стоит) (перевод)
- [Программирование, Управление разработкой, Управление проектами] Оценка трудозатрат в веб- и мобильных проектах
- [Python, Программирование, Машинное обучение] Ранжирование текстов по похожести на опорные тексты при помощи модели TF-IDF в реализации GENSM
- [Программирование] Выбери программирование, выбери уважение
- [Программирование, Java, ООП] Java Core для самых маленьких. Часть 1. Подготовка и первая программа
- [Программирование, Delphi, ООП] Немного про SOLID и суровое зомби-легаси
- [Программирование, Go, DevOps, Интервью] Разрабы становятся админами, а админы — разрабами. Интервью с инженером Uber, где разделение исчезло совсем
- [Open source, *nix, Виртуализация, Карьера в IT-индустрии] Edge-сервера, терминальные сеансы с помощью Linux-команды script и 5 подходов к облачной автоматизации
- [История IT, Научно-популярное, Искусственный интеллект, Мозг] Взгляд из прошлого. Перевод отрывка лекции легендарного Ричарда Фейнмана (перевод)
- [Программирование, Go] В языке Go наконец-то появятся дженерики. Proposal принят
Теги для поиска: #_open_source, #_programmirovanie (Программирование), #_sistemnoe_programmirovanie (Системное программирование), #_kompiljatory (Компиляторы), #_rust, #_clippy, #_cargo, #_rustc, #_rustdoc, #_rustfmt, #_rustfix, #_release, #_stable, #_jazyki_programmirovanija (языки программирования), #_stabilnaja_versija (стабильная версия), #_vypusk_versij (выпуск версий), #_sistemnoe_programmirovanie (системное программирование), #_novosti_tehnologij (новости технологий), #_perevod (перевод), #_open_source, #_programmirovanie (
Программирование
), #_sistemnoe_programmirovanie (
Системное программирование
), #_kompiljatory (
Компиляторы
), #_rust
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 01:18
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Команда Rust рада сообщить о выпуске новой версии — 1.50.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение. Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.50.0 вам достаточно выполнить следующую команду: rustup update stable
Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub. Что вошло в стабильную версию 1.50.0 В этом выпуске мы улучшили индексацию массивов, повысили безопасность доступа к полям объединений, усовершенствовали файловые дескрипторы и добавили их в стандартную библиотеку. Смотрите подробные примечания к выпуску, чтобы узнать о других изменениях, не представленных в данном анонсе. Константные обобщения при индексации массива Продолжая движение к стабилизации константных обобщений, этот выпуск добавляет реализации ops::Index и IndexMut для массивов [T; N] любой длины const N. Оператор индексации [] уже работал с массивами с помощью встроенной магии компилятора, но на уровне типа массивы до сих пор фактически не реализовывали библиотечные типажи. fn second<C>(container: &C) -> &C::Output
where C: std::ops::Index<usize> + ?Sized, { &container[1] } fn main() { let array: [i32; 3] = [1, 2, 3]; assert_eq!(second(&array[..]), &2); // срезы работали ранее assert_eq!(second(&array), &2); // теперь это работает напрямую } const повторение значений массива Массивы в Rust могут быть записаны как в форме списков [a, b, c], так и в форме повторений [x; N]. Повторения разрешены для длины N большей, чем один, только для x, реализующих типаж Copy, и в рамках RFC 2203 мы стремились разрешить любые const выражения. Однако пока эта функциональность была нестабильна для произвольных выражений, лишь начиная с Rust 1.38 её реализация случайно позволила использовать const значения в повторениях массивов. fn main() {
// Это не разрешено, так как `Option<Vec<i32>>` не реализует `Copy`. let array: [Option<Vec<i32>>; 10] = [None; 10]; const NONE: Option<Vec<i32>> = None; const EMPTY: Option<Vec<i32>> = Some(Vec::new()); // Однако повторения с `const` значениями разрешены! let nones = [NONE; 10]; let empties = [EMPTY; 10]; } В Rust 1.50 эта возможность признана официально, так что вы можете использовать такие конструкции без опасений. В будущем для того, чтобы избежать "временных" именований констант, вы можете использовать встроенные выражения const согласно RFC 2920. Безопасные присвоения полям объединения ManuallyDrop<T> В Rust 1.49 появилась возможность добавлять поля ManuallyDrop<T> в union, позволяющая таким образом использовать Drop для объединений. Однако объединения не сбрасывают старые значения во время присваивания полей, так как не знают, какой из вариантов ранее был действителен. Поэтому из соображений безопасности Rust ранее ограничивался только типами Copy, которые не используют Drop. Разумеется, ManuallyDrop<T> не требует Drop, поэтому теперь Rust 1.50 расценивает присваивания и этим полям как безопасные. Ниша для File на Unix платформах У некоторых типов в Rust есть определённые ограничения на то, какое значение считать допустимым, поскольку они могут выходить за границы допустимых значений диапазона памяти. Мы называем любое оставшееся недопустимое значение нишей (niche), и это пространство может быть использовано для оптимизации схемы размещения типов. Например, в Rust 1.28 мы представили целочисленные типы NonZero, такие как NonZeroU8, где 0 — ниша. Это позволило Option<NonZero> использовать 0, чтобы представить None без использования дополнительной памяти. На Unix-платформах File — это просто системный целочисленный файловый дескриптор. Это значит, что у нас есть возможная ниша — ведь он никогда не может быть -1! Системные вызовы, которые возвращают файловый дескриптор, используют -1 для обозначения того, что произошла ошибка (проверяется errno), так что -1 никогда не будет действительным файловым дескриптором. Начиная с Rust 1.50 эта ниша добавлена в определение типа и тоже может быть использована для оптимизации размещения значения в памяти. И следовательно Option<File> теперь имеет такой же размер, как и File! Изменения в стандартной библиотеке В Rust 1.50.0 были стабилизированы следующие 9 функций:
И довольно много существующих функций стало const:
Смотрите подробные примечания к выпуску для более детальной информации. Другие изменения Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения. Участники 1.50.0 Множество людей собрались вместе, чтобы создать Rust 1.50.0. Мы не смогли бы сделать это без всех вас. Спасибо! От переводчиков С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков. Также можете поддержать нас на OpenCollective. Данную статью совместными усилиями перевели andreevlex, TelegaOvoshey, blandger, nlinker и funkill. =========== Источник: habr.com =========== =========== Автор оригинала: The Rust Release Team ===========Похожие новости:
Программирование ), #_sistemnoe_programmirovanie ( Системное программирование ), #_kompiljatory ( Компиляторы ), #_rust |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 01:18
Часовой пояс: UTC + 5