Menu
Coddy logo textTech

Slices como parámetros de función

Parte de la sección Logic & Flow del Journey de Rust de Coddy — lección 56 de 66.

Al escribir funciones que trabajan con cadenas, usar &str como tipo de parámetro en lugar de String hace que tus funciones sean mucho más flexibles y útiles.

Una función que toma un parámetro String solo puede aceptar cadenas con propiedad (owned strings), lo que limita cómo puedes llamarla:

fn print_message(text: String) {
    println!("{}", text);
}

// Esto funciona, pero toma la propiedad
let my_string = String::from("Hello");
print_message(my_string); // my_string ya no se puede usar después de esto

Sin embargo, una función que toma &str puede aceptar tanto referencias de String como literales de cadena, lo que la hace mucho más versátil:

fn print_message(text: &str) {
    println!("{}", text);
}

// Ahora puedes llamarla con cualquier tipo
let my_string = String::from("Hello");
print_message(&my_string); // Pasar una referencia a String
print_message("World");     // Pasar un literal de cadena directamente

Esta flexibilidad significa que tus funciones funcionan en más situaciones sin obligar a quienes las llaman a convertir sus datos o ceder la propiedad.

challenge icon

Desafío

Fácil

Recibirás dos entradas. La primera entrada es un mensaje de texto y la segunda entrada es la longitud máxima permitida para el mensaje. Crea una función llamada truncate_message que tome un slice de cadena (&str) y una longitud máxima (usize) como parámetros. Si la longitud del mensaje excede el máximo, la función debe devolver un slice del mensaje hasta la longitud máxima. De lo contrario, debe devolver el mensaje completo. Imprime el resultado.

Requisitos:

  • Lee la primera entrada (el mensaje de texto) y elimina los espacios en blanco (trim)
  • Lee la segunda entrada (la longitud máxima) y elimina los espacios en blanco (trim)
  • Convierte (parse) la longitud máxima a usize
  • Define una función truncate_message que tome dos parámetros:
    • Un slice de cadena &str para el mensaje
    • Un usize para la longitud máxima
  • Dentro de la función, verifica si la longitud del mensaje es mayor que la longitud máxima
  • Si es así, devuelve un slice del mensaje desde el índice 0 hasta la longitud máxima usando &message[0..max_len]
  • Si no, devuelve el mensaje completo
  • Llama a la función con el mensaje de entrada y la longitud máxima
  • Imprime el resultado devuelto

Entrada:

  • Primera línea: Un mensaje de texto (por ejemplo, Hello World from Rust)
  • Segunda línea: Longitud máxima como un número (por ejemplo, 11)

Salida:

  • El mensaje truncado si excede la longitud máxima, o el mensaje completo en caso contrario

Hoja de referencia

Usar &str como tipo de parámetro hace que las funciones sean más flexibles que usar String, ya que pueden aceptar tanto referencias de cadena como literales de cadena:

fn print_message(text: &str) {
    println!("{}", text);
}

let my_string = String::from("Hello");
print_message(&my_string); // Pasar una referencia a String
print_message("World");     // Pasar un literal de cadena directamente

Para devolver un slice de una cadena hasta una longitud determinada, utiliza la sintaxis de slice:

&message[0..max_len]

Pruébalo tú mismo

use std::io;

// TODO: Define la función truncate_message aquí


fn main() {
    // Leer el mensaje de texto
    let mut message = String::new();
    io::stdin().read_line(&mut message).expect("Failed to read line");
    let message = message.trim();
    
    // Leer la longitud máxima
    let mut max_length_input = String::new();
    io::stdin().read_line(&mut max_length_input).expect("Failed to read line");
    let max_len: usize = max_length_input.trim().parse().expect("Invalid number");
    
    // TODO: Llamar a la función truncate_message y almacenar el resultado
    
    // TODO: Imprimir el resultado
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow