RustIntermedio19 oct 2025
¡El Pánico de los Bytes Indisciplinados! 💥
snippet.rust
fn main() {
let s = "👋 Hello world!"; // El emoji 👋 es de 4 bytes en UTF-8
let (first, rest) = s.split_at(1); // Intentamos dividir en el índice de byte 1
println!("First part: '{}', Rest: '{}'", first, rest);
}¿Qué crees que imprime?
✅ Salida Esperada
First part: '�', Rest: ' Hello world!'
(O un error de compilación, si no conoces Rust a fondo)⚠️ Salida Real
thread 'main' panicked at 'byte index 1 is not a char boundary; it is inside '👋' (bytes 0..4) of `👋 Hello world!`'
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace¿Por qué pasa esto?
¡Ah, Rust y sus cadenas! 🤯 A primera vista, `split_at` parece inofensivo, ¿verdad? Pero aquí el diablo está en los **bytes**. En Rust, las cadenas `&str` son secuencias de bytes **UTF-8 válidas**. Eso significa que un emoji como `👋` no es un solo 'carácter' para el compilador, ¡sino una secuencia de varios bytes (en este caso, 4)!
Cuando llamas a `s.split_at(1)`, le estás diciendo a Rust: 'Córtame la cadena justo después del primer byte'. Pero ese byte es parte de nuestro `👋` (que va del byte 0 al 3). ¡Es como intentar cortar una manzana 🍎 por la mitad de una semilla! 😱 Rust, que es muy estricto con la validez UTF-8, no puede simplemente darte un trozo de un emoji roto.
Así que, en lugar de un `Option` o un `Result` (porque esto se considera un **error de programación**), Rust entra en modo '¡PÁNICO! ¡No puedo garantizar UTF-8 válido aquí!' y te lanza un `panic!`. ¡Sorpresa! 💥 Para dividir cadenas de forma segura por caracteres visibles, tendrías que usar iteradores como `char_indices()` o crates para manejar **grapheme clusters**.
Conceptos relacionados
string-handlingutf8panic