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