Início Tecnologia Ferrugem 1.83.0: detalhando as alterações

Ferrugem 1.83.0: detalhando as alterações

18
0

A equipe de ferrugem está feliz em anunciar uma nova versão do Rust, 1.83.0. A ferrugem é uma linguagem de programação que capacita todos a criar software program confiável e eficiente.

Se você tem uma versão anterior do Rust instalado through rustupvocê pode obter 1.83.0 com:

$ rustup replace steady

Se você ainda não o tem, você pode obter rustup Na página apropriada em nosso web site e confira as notas de lançamento detalhadas para 1.83.0.

Se você quiser nos ajudar testando lançamentos futuros, considere atualizar localmente para usar o canal beta (rustup default beta) ou o canal noturno (rustup default nightly). Por favor, relate todos os bugs que você pode encontrar!

O que há em 1.83.0 estável

Novos recursos const

Esta versão inclui várias extensões grandes para o que o código em execução em contextos constantes pode fazer. Isso se refere a todo o código que o compilador deve avaliar em tempo de compilação: o valor inicial de const e static Itens, comprimentos de matriz, valores discriminantes em enum, argumentos genéricos const e funções chamáveis ​​de tais contextos (const fn).

Referências à estática. Até agora, contextos constantes, exceto pela expressão inicializadora de um static o merchandise foi proibido de referenciar static Unid. Essa limitação já foi levantada:

static S: i32 = 25;
const C: &i32 = &S;

Observe, no entanto, que a leitura do valor de uma estática mutável ou inside ainda não é permitida em contextos constantes.

Além disso, o valor last de uma constante não pode referir nenhuma estática mutável ou inside mutável:

static mut S: i32 = 0;

const C1: i32 = unsafe { S };
// error: fixed accesses mutable world reminiscence

const C2: &i32 = unsafe { &S };
// error: encountered reference to mutable reminiscence in `const`

Essas limitações garantem que as constantes ainda sejam “constantes”: o valor que avaliam e seu significado como um padrão (que pode envolver referências de desreferência), será o mesmo ao longo de toda a execução do programa.

Dito isto, uma constante pode avaliar um ponteiro bruto que aponta para uma estática mutável ou inside mutável:

static mut S: i32 = 64;
const C: *mut i32 = &uncooked mut S;

Referências e indicadores mutáveis. Agora é possível usar referências mutáveis ​​em contextos constantes:

const fn inc(x: &mut i32) {
    *x += 1;
}

const C: i32 = {
    let mut c = 41;
    inc(&mut c);
    c
};

Ponteiros crus mutáveis ​​e mutabilidade inside também são suportados:

use std::cell::UnsafeCell;

const C: i32 = {
    let c = UnsafeCell::new(41);
    unsafe { *c.get() += 1 };
    c.into_inner()
};

No entanto, referências e ponteiros mutáveis ​​só podem ser usados dentro O cálculo de uma constante, eles não podem se tornar parte do valor last da constante:

const C: &mut i32 = &mut 4;
// error[E0764]: mutable references should not allowed within the last worth of constants

Esta versão também é enviada com uma sacola inteira de novas funções que agora são estáveis ​​em contextos constantes (consulte o last da seção “APIs estabilizadas”).

Esses novos recursos e APIs estabilizadas desbloqueam uma nova e nova categoria de código a ser executada em contextos const const, e estamos animados em ver como o ecossistema de ferrugem fará uso disso!

APIs estabilizadas

  • BufRead::skip_until
  • ControlFlow::break_value
  • ControlFlow::continue_value
  • ControlFlow::map_break
  • ControlFlow::map_continue
  • DebugList::finish_non_exhaustive
  • DebugMap::finish_non_exhaustive
  • DebugSet::finish_non_exhaustive
  • DebugTuple::finish_non_exhaustive
  • ErrorKind::ArgumentListTooLong
  • ErrorKind::Impasse
  • ErrorKind::DirectoryNotEmpty
  • ErrorKind::ExecutableFileBusy
  • ErrorKind::FileTooLarge
  • ErrorKind::HostUnreachable
  • ErrorKind::IsADirectory
  • ErrorKind::NetworkDown
  • ErrorKind::NetworkUnreachable
  • ErrorKind::NotADirectory
  • ErrorKind::NotSeekable
  • ErrorKind::ReadOnlyFilesystem
  • ErrorKind::ResourceBusy
  • ErrorKind::StaleNetworkFileHandle
  • ErrorKind::StorageFull
  • ErrorKind::TooManyLinks
  • Possibility::get_or_insert_default
  • Waker::knowledge
  • Waker::new
  • Waker::vtable
  • char::MIN
  • hash_map::Entry::insert_entry
  • hash_map::VacantEntry::insert_entry

Essas APIs agora estão estáveis ​​em contextos constantes:

  • Cell::into_inner
  • Length::as_secs_f32
  • Length::as_secs_f64
  • Length::div_duration_f32
  • Length::div_duration_f64
  • MaybeUninit::as_mut_ptr
  • NonNull::as_mut
  • NonNull::copy_from
  • NonNull::copy_from_nonoverlapping
  • NonNull::copy_to
  • NonNull::copy_to_nonoverlapping
  • NonNull::slice_from_raw_parts
  • NonNull::write
  • NonNull::write_bytes
  • NonNull::write_unaligned
  • OnceCell::into_inner
  • Possibility::as_mut
  • Possibility::count on
  • Possibility::exchange
  • Possibility::take
  • Possibility::unwrap
  • Possibility::unwrap_unchecked
  • Possibility::<&_>::copied
  • Possibility::<&mut _>::copied
  • Possibility::
  • Possibility::>::transpose
  • RefCell::into_inner
  • Consequence::as_mut
  • Consequence::<&_, _>::copied
  • Consequence::<&mut _, _>::copied
  • Consequence::
  • UnsafeCell::get_mut
  • UnsafeCell::into_inner
  • array::from_mut
  • char::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_bytes
  • mem::exchange
  • ptr::exchange
  • ptr::slice_from_raw_parts_mut
  • ptr::write
  • ptr::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_unaligned
  • slice::from_mut
  • slice::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_mut
  • str::as_bytes_mut
  • str::as_mut_ptr
  • str::from_utf8_unchecked_mut

Outras mudanças

Confira tudo o que mudou em ferrugem, carga e clippy.

Contribuintes para 1.83.0

Muitas pessoas se uniram para criar ferrugem 1.83.0. Não poderíamos ter feito isso sem todos vocês. Obrigado!


A equipe de liberação da ferrugem

Também publicado aqui

Foto de Jr Korpa no Unsplash

fonte