Introducción
Rust utiliza String para representar texto propietario y ampliable, y &str para representar una vista prestada del texto. Un slice de cadena puede ver una cadena completa o un rango de bytes seleccionado sin copiar sus caracteres.
Pasará texto propietario a una función que toma un &str prestado, creará una palabra clave de comando prestada y pedirá intencionadamente al compilador que indexe texto UTF-8 de una forma no admitida. Después, corregirá el código mediante un slice válido que respete los límites.
Prestar texto propietario y literal como &str
En este paso, pasará dos fuentes de texto diferentes a una misma función que acepta un slice de cadena prestado.
Entre en el proyecto preparado y abra su código fuente:
cd /home/labex/project/string-slices
nano src/main.rs
El tipo String es propietario de un texto ampliable. El tipo &str, que se pronuncia “string slice”, es una vista prestada de texto UTF-8 válido. Un literal de cadena como "preview" ya tiene un tipo de slice de cadena prestado, porque el programa conserva su texto durante toda la ejecución.
La función show_text(label: &str) puede ver cualquiera de los dos tipos de texto. Sustituya únicamente /* Step 1: borrow command */ por &command:
show_text(&command);
Rust convierte automáticamente el &String prestado en la vista &str que solicita la función. Esta conversión no copia ni mueve los caracteres.
Guarde el archivo con Ctrl+O, pulse Enter y salga con Ctrl+X. Ejecute el programa:
cargo run --quiet
La salida debe ser:
Text: serve reports
Text: preview
Keyword: <>
Status: ✅ ready
Ambas llamadas llegan al mismo parámetro &str. La palabra clave vacía es un marcador preparado para el siguiente paso.
Prestar una subcadena sin copiarla
En este paso, hará que keyword vea únicamente el prefijo serve dentro de command.
Abra el código fuente:
nano src/main.rs
La forma de slice &text[start..end] toma prestado un rango. El inicio se incluye y el final se excluye. Los rangos de cadenas de Rust cuentan bytes, y cada letra ASCII de serve ocupa un byte, por lo que el rango comienza en el byte 0 y termina antes del byte 5.
Sustituya únicamente el literal vacío "" de la línea del paso 2 por &command[0..5]:
let keyword = &command[0..5]; // Step 2: replace the empty slice.
El &str resultante apunta dentro de command; no reserva memoria ni copia una segunda cadena. Como command sigue dentro del ámbito, la vista prestada continúa siendo válida mientras se utiliza keyword.
Guarde el archivo y salga; después, ejecute:
cargo run --quiet
La última línea debe ser ahora:
Keyword: <serve>
El command propietario todavía contiene el texto completo serve reports, mientras que keyword es únicamente una ventana prestada de sus primeros cinco bytes.
Respetar los límites de los caracteres UTF-8
En este paso, intentará intencionadamente utilizar un índice entero, leerá la explicación del compilador y lo sustituirá por un slice UTF-8 válido.
Los caracteres UTF-8 no ocupan todos un solo byte. En "✅ ready", el símbolo de verificación utiliza tres bytes. Por tanto, el byte cero no es automáticamente “el primer carácter”, y Rust no permite usar status[0] sobre un String.
Abra el archivo y elimine únicamente los caracteres iniciales // de la línea de impresión del paso 3:
nano src/main.rs
Guarde el archivo y salga; después, ejecute la comprobación. Es normal que falle:
cargo check
Busque el mensaje estable:
error[E0277]: the type `str` cannot be indexed by `{integer}`
Este diagnóstico evita que suponga que cada carácter tiene una posición de un solo byte. Abra de nuevo el archivo y sustituya la línea de impresión que produce el error por estas dos líneas breves:
let symbol = &status[0..3];
println!("Status symbol: {symbol}");
El rango 0..3 termina exactamente después de los tres bytes del símbolo. Esto funciona porque el texto preparado y su límite de bytes se conocen de antemano; no es una forma general de encontrar el primer carácter visible para una persona en un texto arbitrario. Un rango que corte el centro de un carácter UTF-8 provocaría un pánico durante la ejecución, por lo que los rangos de cadenas deben basarse en límites UTF-8 válidos conocidos.
Guarde el archivo y salga; después, compruebe y ejecute el programa:
cargo check
cargo run --quiet
La salida completa debe ser:
Text: serve reports
Text: preview
Keyword: <serve>
Status: ✅ ready
Status symbol: ✅
La salida correcta demuestra que el slice final selecciona un carácter UTF-8 completo sin copiar el String original.
Resumen
Ha relacionado valores String propietarios con vistas &str prestadas, ha seleccionado una subcadena sin reservar memoria y ha aprendido por qué el texto UTF-8 no puede tratarse como una matriz de caracteres indexada por bytes. Los rangos seguros de cadenas deben comenzar y terminar en límites UTF-8 válidos.


