Wycinki jako parametry funkcji
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 56 z 66.
Podczas pisania funkcji, które działają na ciągach znaków, użycie &str jako typu parametru zamiast String sprawia, że funkcje są znacznie bardziej elastyczne i przydatne.
Funkcja, która przyjmuje parametr typu String, może przyjmować tylko ciągi znaków będące własnością wywołującego, co ogranicza sposób jej wywoływania:
fn print_message(text: String) {
println!("{}", text);
}
// To działa, ale przejmuje własność
let my_string = String::from("Hello");
print_message(my_string); // Po tym nie można już używać my_stringJednak funkcja przyjmująca &str może akceptować zarówno referencje do String, jak i literały łańcuchowe, dzięki czemu jest znacznie bardziej wszechstronna:
fn print_message(text: &str) {
println!("{}", text);
}
// Teraz możesz wywołać ją z argumentem dowolnego z tych typów
let my_string = String::from("Hello");
print_message(&my_string); // Przekaż referencję do String
print_message("World"); // Przekaż bezpośrednio literał tekstowyTa elastyczność oznacza, że Twoje funkcje sprawdzają się w większej liczbie sytuacji, nie zmuszając wywołujących ich do konwertowania danych ani rezygnowania z ich własności.
Wyzwanie
ŁatwyOtrzymasz dwa dane wejściowe. Pierwszym jest wiadomość tekstowa, a drugim maksymalna dozwolona długość wiadomości. Utwórz funkcję o nazwie truncate_message, która przyjmuje jako parametry wycinek ciągu znaków (&str) i maksymalną długość (usize). Jeśli długość wiadomości przekracza maksymalną długość, funkcja powinna zwrócić wycinek wiadomości o długości równej tej maksymalnej długości. W przeciwnym razie powinna zwrócić całą wiadomość. Wypisz wynik.
Wymagania:
- Odczytaj pierwsze dane wejściowe (wiadomość tekstową) i usuń białe znaki z jej początku i końca
- Odczytaj drugie dane wejściowe (maksymalną długość) i usuń białe znaki z jej początku i końca
- Przekształć maksymalną długość na typ
usize - Zdefiniuj funkcję
truncate_message, która przyjmuje dwa parametry:- Wycinek ciągu znaków
&strreprezentujący wiadomość - Wartość typu
usizeokreślającą maksymalną długość
- Wycinek ciągu znaków
- Wewnątrz funkcji sprawdź, czy długość wiadomości jest większa niż maksymalna długość
- Jeśli tak, zwróć wycinek wiadomości od indeksu 0 do maksymalnej długości, używając
&message[0..max_len] - Jeśli nie, zwróć całą wiadomość
- Wywołaj funkcję, przekazując jej wiadomość wejściową i maksymalną długość
- Wypisz zwrócony wynik
Dane wejściowe:
- Pierwszy wiersz: wiadomość tekstowa (np.
Hello World from Rust) - Drugi wiersz: maksymalna długość jako liczba (np.
11)
Wynik:
- Skrócona wiadomość, jeśli przekracza maksymalną długość, lub cała wiadomość w przeciwnym razie
Spróbuj swoich sił
use std::io;
// TODO: Zdefiniuj tutaj funkcję truncate_message
fn main() {
// Wczytaj wiadomość tekstową
let mut message = String::new();
io::stdin().read_line(&mut message).expect("Failed to read line");
let message = message.trim();
// Wczytaj maksymalną długość
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: Wywołaj funkcję truncate_message i zapisz wynik
// TODO: Wyświetl wynik
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Zaawansowane sterowanie przepływem
Wyrażenie „match”Dopasowywanie wielu wartościDopasowywanie zakresówWyrażenie „if let”Pętle jako wyrażeniaPodsumowanie — prosty parser poleceń4Grupowanie danych za pomocą struktur
Czym jest struktura?Przegląd strukturDostęp do pól strukturyModyfikowalne strukturyStruktury jako parametry funkcjiStruktury krotkowePodsumowanie — utwórz strukturę Book2Wprowadzenie do wektorów
Czym jest wektor?Tworzenie wektoraDodawanie elementów za pomocą pushDostęp do elementów wektoraIterowanie po wektorzeIterowanie z możliwością modyfikacjiUsuwanie elementówPodsumowanie — prosty licznik punktów5Pary klucz–wartość z mapami hashującymi
Czym jest mapa haszująca?Tworzenie mapy haszującejWstawianie par klucz–wartośćDostęp do wartościIterowanie po mapie haszującejAktualizowanie wartościUsuwanie paryPodsumowanie – licznik słów8Projekt: Prosty system inwentaryzacji
Konfiguracja projektuDodawanie produktuSprawdzanie stanu magazynowegoSprzedaż produktuŁączenie wszystkiego w całość3Lista zadań w wierszu poleceń
Konfiguracja projektuDodawanie zadaniaWyświetlanie wszystkich zadańUsuwanie zadaniaKońcowy kod6Obsługa braku wartości za pomocą „Option”
Czym jest „Option”?Używanie „match” z „Option”is_some() i is_none()Rozpakowywanie „Option”Metoda expectPodawanie wartości domyślnej: unwrap_orPodsumowanie – znajdowanie elementu9Wycinki napisów i więcej
String a &strTworzenie wycinków napisówWycinki jako parametry funkcjiInne wycinkiPodsumowanie — znajdowanie pierwszego słowaPoćwicz samodzielnie: Kompilator Rust online