Ржавчина 1.83.0: детализация изменений
14 июня 2025 г.Команда Rust с радостью объявила о новой версии Rust, 1.83.0. Rust - это язык программирования, позволяющий всем создавать надежное и эффективное программное обеспечение.
Если у вас предыдущая версия Rust, установленная черезrustup, вы можете получить 1.83.0 с:
$ rustup update stable
Если у вас его еще нет, вы можетеполучатьrustupНа соответствующей странице на нашем веб -сайте и проверьтеПодробные заметки о выпуске для 1.83.0Полем
Если вы хотите помочь нам, тестируя будущие релизы, вы можете рассмотреть возможность обновления локально для использования бета -канала (rustup default beta) или ночной канал (rustup default nightly) ПожалуйстаотчетЛюбые ошибки, с которыми вы можете встретить!
Что в 1,83,0 стабильной
Новые возможности Const
Этот релиз включает в себя несколько больших расширений к тому, что может сделать код, работающий в контексте контекста. Это относится ко всему коду, который компилятор должен оценить во время компиляции: начальное значениеconstиstaticЭлементы, длины массива, дискриминантные значения перечисления, константные аргументы и функции, вызывшие из таких контекстов (const fn)
Ссылки на статику.Пока что кондиционеры, за исключением экспрессии инициализатораstaticПредмет был запрещен при ссылкеstaticпредметы. Это ограничение теперь поднято:
static S: i32 = 25;
const C: &i32 = &S;
Обратите внимание, однако, что чтение значения изменяемого или внутреннего изменяемого статического статика до сих пор не разрешено в контексте контекста.
Кроме того, конечное значение константы не может ссылаться на какую -либо измененную или внутреннюю изменчивую статику:
static mut S: i32 = 0;
const C1: i32 = unsafe { S };
// error: constant accesses mutable global memory
const C2: &i32 = unsafe { &S };
// error: encountered reference to mutable memory in `const`
Эти ограничения гарантируют, что константы все еще являются «постоянными»: значение, которое они оценивают, и их значение как шаблона (которая может включать в себя ссылки на приземление), будет одинаковым на протяжении всего выполнения программы.
Тем не менее, константа разрешена оценивать необработанное указатель, который указывает на изменяемый или внутренний измененный статический статик:
static mut S: i32 = 64;
const C: *mut i32 = &raw mut S;
Изменяемые ссылки и указатели.Теперь можно использовать изменяемые ссылки в контексте контекста:
const fn inc(x: &mut i32) {
*x += 1;
}
const C: i32 = {
let mut c = 41;
inc(&mut c);
c
};
Также поддерживаются изменяемые необработанные указатели и внутренняя изменчивость:
use std::cell::UnsafeCell;
const C: i32 = {
let c = UnsafeCell::new(41);
unsafe { *c.get() += 1 };
c.into_inner()
};
Однако, изменяемые ссылки и указатели могут быть использованы тольковнутриВычисление постоянной, они не могут стать частью конечного значения константы:
const C: &mut i32 = &mut 4;
// error[E0764]: mutable references are not allowed in the final value of constants
Этот релиз также поставляется с целым пакетом новых функций, которые теперь стабильны в контексте констатации (см. Конец секции «стабилизированные API»).
Эти новые возможности и стабилизированные API не заблокируют совершенно новую категорию кода, которая будет выполнена в контексте Const, и мы рады увидеть, как экосистема ржавчины использует это!
Стабилизированные API
BufRead::skip_untilControlFlow::break_valueControlFlow::continue_valueControlFlow::map_breakControlFlow::map_continueDebugList::finish_non_exhaustiveDebugMap::finish_non_exhaustiveDebugSet::finish_non_exhaustiveDebugTuple::finish_non_exhaustiveErrorKind::ArgumentListTooLongErrorKind::DeadlockErrorKind::DirectoryNotEmptyErrorKind::ExecutableFileBusyErrorKind::FileTooLargeErrorKind::HostUnreachableErrorKind::IsADirectoryErrorKind::NetworkDownErrorKind::NetworkUnreachableErrorKind::NotADirectoryErrorKind::NotSeekableErrorKind::ReadOnlyFilesystemErrorKind::ResourceBusyErrorKind::StaleNetworkFileHandleErrorKind::StorageFullErrorKind::TooManyLinksOption::get_or_insert_defaultWaker::dataWaker::newWaker::vtablechar::MINhash_map::Entry::insert_entryhash_map::VacantEntry::insert_entry
Эти API теперь стабильны в контексте:
Cell::into_innerDuration::as_secs_f32Duration::as_secs_f64Duration::div_duration_f32Duration::div_duration_f64MaybeUninit::as_mut_ptrNonNull::as_mutNonNull::copy_fromNonNull::copy_from_nonoverlappingNonNull::copy_toNonNull::copy_to_nonoverlappingNonNull::slice_from_raw_partsNonNull::writeNonNull::write_bytesNonNull::write_unalignedOnceCell::into_innerOption::as_mutOption::expectOption::replaceOption::takeOption::unwrapOption::unwrap_uncheckedOption::<&_>::copiedOption::<&mut _>::copiedOption::<Option<_>>::flattenOption::<Result<_, _>>::transposeRefCell::into_innerResult::as_mutResult::<&_, _>::copiedResult::<&mut _, _>::copiedResult::<Option<_>, _>::transposeUnsafeCell::get_mutUnsafeCell::into_innerarray::from_mutchar::encode_utf8{float}::classify{float}::is_finite{float}::is_infinite{float}::is_nan{float}::is_normal{float}::is_sign_negative{float}::is_sign_positive{float}::is_subnormal{float}::from_bits{float}::from_be_bytes{float}::from_le_bytes{float}::from_ne_bytes{float}::to_bits{float}::to_be_bytes{float}::to_le_bytes{float}::to_ne_bytesmem::replaceptr::replaceptr::slice_from_raw_parts_mutptr::writeptr::write_unaligned<*const _>::copy_to<*const _>::copy_to_nonoverlapping<*mut _>::copy_from<*mut _>::copy_from_nonoverlapping<*mut _>::copy_to<*mut _>::copy_to_nonoverlapping<*mut _>::write<*mut _>::write_bytes<*mut _>::write_unalignedslice::from_mutslice::from_raw_parts_mut<[_]>::first_mut<[_]>::last_mut<[_]>::first_chunk_mut<[_]>::last_chunk_mut<[_]>::split_at_mut<[_]>::split_at_mut_checked<[_]>::split_at_mut_unchecked<[_]>::split_first_mut<[_]>::split_last_mut<[_]>::split_first_chunk_mut<[_]>::split_last_chunk_mutstr::as_bytes_mutstr::as_mut_ptrstr::from_utf8_unchecked_mut
Другие изменения
Проверьте все, что изменилось вРжавчинаВГруз, иКлиппиПолем
Вкладчики в 1,83,0
Многие люди собрались вместе, чтобы создать ржавчину 1.83.0. Мы не могли бы сделать это без всех вас.Спасибо!
Команда релиза ржавчины
Также опубликованоздесь
ФотоJr KorpaнаНеспособный
Оригинал