Slices como Parâmetros de Função
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 56 de 66.
Ao escrever funções que trabalham com strings, usar &str como um tipo de parâmetro em vez de String torna suas funções muito mais flexíveis e úteis.
Uma função que recebe um parâmetro String pode aceitar apenas strings com propriedade (owned), o que limita como você pode chamá-la:
fn print_message(text: String) {
println!("{}", text);
}
// Isso funciona, mas assume a posse (ownership)
let my_string = String::from("Hello");
print_message(my_string); // my_string não é mais utilizável após issoNo entanto, uma função que recebe &str pode aceitar tanto referências de String quanto literais de string, tornando-a muito mais versátil:
fn print_message(text: &str) {
println!("{}", text);
}
// Agora você pode chamá-la com qualquer um dos tipos
let my_string = String::from("Hello");
print_message(&my_string); // Passa uma referência para String
print_message("World"); // Passa um literal de string diretamenteEssa flexibilidade significa que suas funções funcionam em mais situações sem forçar quem as chama a converter seus dados ou abrir mão da posse.
Desafio
FácilVocê receberá duas entradas. A primeira entrada é uma mensagem de texto e a segunda entrada é o comprimento máximo permitido para a mensagem. Crie uma função chamada truncate_message que recebe um slice de string (&str) e um comprimento máximo (usize) como parâmetros. Se o comprimento da mensagem exceder o máximo, a função deve retornar um slice da mensagem até o comprimento máximo. Caso contrário, ela deve retornar a mensagem inteira. Imprima o resultado.
Requisitos:
- Leia a primeira entrada (a mensagem de texto) e remova os espaços em branco (trim)
- Leia a segunda entrada (o comprimento máximo) e remova os espaços em branco (trim)
- Converta (parse) o comprimento máximo para
usize - Defina uma função
truncate_messageque recebe dois parâmetros:- Um slice de string
&strpara a mensagem - Um
usizepara o comprimento máximo
- Um slice de string
- Dentro da função, verifique se o comprimento da mensagem é maior que o comprimento máximo
- Se sim, retorne um slice da mensagem do índice 0 até o comprimento máximo usando
&message[0..max_len] - Se não, retorne a mensagem inteira
- Chame a função com a mensagem de entrada e o comprimento máximo
- Imprima o resultado retornado
Entrada:
- Primeira linha: Uma mensagem de texto (ex:
Hello World from Rust) - Segunda linha: Comprimento máximo como um número (ex:
11)
Saída:
- A mensagem truncada se ela exceder o comprimento máximo, ou a mensagem completa caso contrário
Folha de consulta
Usar &str como um tipo de parâmetro torna as funções mais flexíveis do que usar String, pois elas podem aceitar tanto referências de string quanto literais de string:
fn print_message(text: &str) {
println!("{}", text);
}
let my_string = String::from("Hello");
print_message(&my_string); // Passa uma referência para String
print_message("World"); // Passa um literal de string diretamentePara retornar um slice de uma string até um certo comprimento, use a sintaxe de slice:
&message[0..max_len]Experimente você mesmo
use std::io;
// TODO: Defina a função truncate_message aqui
fn main() {
// Lê a mensagem de texto
let mut message = String::new();
io::stdin().read_line(&mut message).expect("Failed to read line");
let message = message.trim();
// Lê o comprimento máximo
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: Chame a função truncate_message e armazene o resultado
// TODO: Imprima o resultado
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fluxo de Controle Avançado
A Expressão 'match'Correspondência de Múltiplos ValoresCorrespondência de IntervalosA Expressão 'if let'Loops como ExpressõesRecapitulação - Parser de Comandos Simples4Agrupando Dados com Structs
O que é uma Struct?Visão Geral de StructsAcessando Campos de uma StructStructs MutáveisStructs como Parâmetros de FunçãoTuple StructsRecapitulação - Criando uma Struct Book2Introdução a Vetores
O que é um Vetor?Criando um VetorAdicionando Elementos com pushAcessando Elementos do VetorIterando sobre um VetorIteração MutávelRemovendo ElementosRecapitulação - Rastreador de Pontuação Básico5Pares Chave-Valor com Hash Maps
O que é um Hash Map?Criando um Hash MapInserindo Pares Chave-ValorAcessando ValoresIterando sobre um Hash MapAtualizando um ValorRemovendo um ParRecapitulação - Contador de Palavras8Projeto: Inventário Simples de Itens
Configuração do ProjetoAdicionando um ItemVerificando o EstoqueVendendo um ItemJuntando tudo3Lista de Tarefas via Linha de Comando
Configuração do ProjetoAdicionando uma TarefaVisualizando Todas as TarefasRemovendo uma TarefaCódigo Final6Lidando com a Ausência com 'Option'
O que é um 'Option'?Usando 'match' com 'Option'is_some() e is_none()Fazendo o unwrap de um 'Option'O método expectFornecendo um valor padrão: unwrap_orRecapitulação - Encontrar um Elemento9Slices de String e Mais
String vs. &strCriando Slices de StringSlices como Parâmetros de FunçãoOutros SlicesRecapitulação - Encontrar a Primeira Palavra