ps4 - rust traduccion
Emitir un `u32` a` char` (1)
Estoy tratando de aprender a Rust aquí y me pillé pensando en cómo las char
tienen 4 bytes de ancho:
let pizza_hex: u32 = 0x1f355;
let pizza: char = ''🍕''; // (pizza char: http://www.fileformat.info/info/unicode/char/1f355/index.htm)
// pizza as hex = 1f355
println!("pizza as hex = {:x}", pizza as u32);
// size of pizza = 4
println!("size of pizza = {}", std::mem::size_of_val(&pizza));
// This doesn''t work super well
println!("{} == {}", pizza_hex as char, pizza);
Como se ve arriba, puedo lanzar un char
a un u32
y funciona (ambos tienen 4 bytes de ancho). Sin embargo, cuando u32
desde un u32
a un char
, Rust se queja.
error: only `u8` can be cast as `char`, not `u32`
println!("{} == {}", pizza_hex as char, pizza);
^~~~~~~~~~~~~~~~~
¿Alguna idea de por qué?
Solo porque cada char
es un valor válido de u32
, pero no todos los valores de u32
son caracteres válidos.
afaict, la propiedad de los char
s que tienen puntos de código Unicode válidos eventualmente tiene en cuenta la seguridad de la memoria cuando se trata de las partes internas inseguras del manejo de cadenas, o algo así.
Para convertir en tiempo de ejecución, intente esto:
// [...]
let maybe_pizza: Option<char> = std::char::from_u32(pizza_hex);
match maybe_pizza {
Some(pizza_from_hex) => { println!("{} == {}", pizza_from_hex, pizza); }
_ => {}
}
Si simplemente no quieres glifos Unicode espeluznantes en los literales de tus personajes, puedes usar secuencias de escape:
// [...]
let pizza_from_hex = ''/u{01f355}'';
println!("{} == {}", pizza_from_hex, pizza);