Moldagem
A Rust não fornece nenhuma conversão (coerção) de tipo implícita entre tipos primitivos. Mas, a conversão (moldagem) de tipo explícita pode ser realizada usando a palavra-chave as
.
As regras para converter entre tipos integrais segue geralmente as convenções da C, exceto em casos onde a C tem comportamento não definido. O comportamento de todos os moldes entre tipos integrais é bem definido na Rust.
// Suprimir todos os avisos dos moldes que transbordam.#![allow(overflowing_literals)]fn main() {let decimal = 65.4321_f32;// Error! Sem conversão implícitalet integer: u8 = decimal;// FIXME ^ Comente esta linha// Conversão explícitalet integer = decimal as u8;let character = integer as char;// Error! Existem limitações nas regras de conversão.// Um flutuante não pode ser diretamente convertido à um carácter.let character = decimal as char;// FIXME ^ Comente esta linhaprintln!("Casting: {} -> {} -> {}", decimal, integer, character);// quando moldamos qualquer valor à um tipo sem sinal, T,// T::MAX + 1 é adicionado ou subtraído até o valor caber num novo tipo// 1000 já cabe num u16println!("1000 as a u16 is: {}", 1000 as u16);// 1000 - 256 - 256 - 256 = 232// Nos bastidores, o primeiro os bits menos significativos de 8 são mantidos,// enquanto o resto perto do bit mais significativo é truncado.println!("1000 as a u8 is : {}", 1000 as u8);// -1 + 256 = 255println!(" -1 as a u8 is : {}", (-1i8) as u8);// Para os números positivos, isto é o mesmo que modulusprintln!("1000 mod 256 is : {}", 1000 % 256);// Quando moldamos à um tipo com sinal, o resultado (bitwise) é o mesmo que// a primeira moldagem ao tipo sem sinal correspondente.// Se o bit mais significativo deste valor for 1, então o valor é negativo.// A menos que já caiba, claro.println!(" 128 as a i16 is: {}", 128 as i16);// 128 as u8 -> 128,// cujo valor na representação de complemento dos dois de 8-bit é:println!(" 128 as a i8 is : {}", 128 as i8);// repetindo o exemplo acima// 1000 as u8 -> 232println!("1000 as a u8 is : {}", 1000 as u8);// e o valor de 232 na representação de complemento dos dois de 8-bit é -24println!(" 232 as a i8 is : {}", 232 as i8);// Desde a Rust 1.45, a palavra-chave `as` realiza um *molde de saturação*// quando moldamos de flutuante à inteiro. Se o valor de ponto flutuante// excede o saldo máximo ou é menos do que o saldo mínimo, o valor// retornado será igual ao salto cruzado.// 300.0 as u8 é 255println!(" 300.0 as u8 is : {}", 300.0_f32 as u8);// -100.0 as u8 é 0println!("-100.0 as u8 is : {}", -100.0_f32 as u8);// nan as u8 é 0println!(" nan as u8 is : {}", f32::NAN as u8);// Este comportamento incorre num pequeno custo de execução e// pode ser evitado com métodos inseguros, no entanto o resultado pode// transbordar e retornar **valores incertos**. Use estes métodos sabiamente:unsafe {// 300.0 as u8 é 44println!(" 300.0 as u8 is : {}", 300.0_f32.to_int_unchecked::<u8>());// -100.0 as u8 é 156println!("-100.0 as u8 is : {}", (-100.0_f32).to_int_unchecked::<u8>());// nan as u8 é 0println!(" nan as u8 is : {}", f32::NAN.to_int_unchecked::<u8>());}}