함수 매개변수로서의 슬라이스
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 56번째.
문자열을 다루는 함수를 작성할 때, 매개변수 타입으로 String 대신 &str을 사용하는 것은 함수를 훨씬 더 유연하고 유용하게 만듭니다.
String 매개변수를 받는 함수는 소유권이 있는(owned) 문자열만 받을 수 있으며, 이는 함수를 호출하는 방식을 제한합니다:
fn print_message(text: String) {
println!("{}", text);
}
// 이 코드는 작동하지만, 소유권을 가져갑니다
let my_string = String::from("Hello");
print_message(my_string); // 이 시점 이후로 my_string은 더 이상 사용할 수 없습니다하지만 &str을 받는 함수는 String 참조와 문자열 리터럴을 모두 받아들일 수 있어 훨씬 더 다재다능합니다:
fn print_message(text: &str) {
println!("{}", text);
}
// 이제 두 타입 중 하나로 호출할 수 있습니다
let my_string = String::from("Hello");
print_message(&my_string); // String에 대한 참조를 전달합니다
print_message("World"); // 문자열 리터럴을 직접 전달합니다이러한 유연성 덕분에 호출자가 데이터를 변환하거나 소유권을 포기할 필요 없이, 함수가 더 다양한 상황에서 작동할 수 있습니다.
챌린지
쉬움두 개의 입력을 받게 됩니다. 첫 번째 입력은 텍스트 메시지이고, 두 번째 입력은 메시지에 허용되는 최대 길이입니다. 문자열 슬라이스(&str)와 최대 길이(usize)를 매개변수로 받는 truncate_message라는 함수를 만드세요. 메시지 길이가 최대 길이를 초과하면, 함수는 최대 길이까지의 메시지 슬라이스를 반환해야 합니다. 그렇지 않으면 전체 메시지를 반환해야 합니다. 결과를 출력하세요.
요구 사항:
- 첫 번째 입력(텍스트 메시지)을 읽고 공백을 제거(trim)합니다.
- 두 번째 입력(최대 길이)을 읽고 공백을 제거(trim)합니다.
- 최대 길이를
usize타입으로 파싱합니다. - 두 개의 매개변수를 받는
truncate_message함수를 정의합니다:- 메시지를 위한 문자열 슬라이스
&str - 최대 길이를 위한
usize
- 메시지를 위한 문자열 슬라이스
- 함수 내부에서 메시지 길이가 최대 길이보다 큰지 확인합니다.
- 만약 그렇다면,
&message[0..max_len]을 사용하여 인덱스 0부터 최대 길이까지의 메시지 슬라이스를 반환합니다. - 그렇지 않으면, 전체 메시지를 반환합니다.
- 입력받은 메시지와 최대 길이로 함수를 호출합니다.
- 반환된 결과를 출력합니다.
입력:
- 첫 번째 줄: 텍스트 메시지 (예:
Hello World from Rust) - 두 번째 줄: 숫자로 된 최대 길이 (예:
11)
출력:
- 최대 길이를 초과하는 경우 잘린 메시지, 그렇지 않은 경우 전체 메시지
치트 시트
&str을 매개변수 타입으로 사용하면 String을 사용하는 것보다 함수가 더 유연해집니다. 문자열 참조와 문자열 리터럴을 모두 받아들일 수 있기 때문입니다:
fn print_message(text: &str) {
println!("{}", text);
}
let my_string = String::from("Hello");
print_message(&my_string); // String에 대한 참조를 전달합니다
print_message("World"); // 문자열 리터럴을 직접 전달합니다특정 길이까지의 문자열 슬라이스를 반환하려면 슬라이스 구문을 사용하세요:
&message[0..max_len]직접 해보기
use std::io;
// TODO: 여기에 truncate_message 함수를 정의하세요
fn main() {
// 텍스트 메시지 읽기
let mut message = String::new();
io::stdin().read_line(&mut message).expect("Failed to read line");
let message = message.trim();
// 최대 길이 읽기
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: truncate_message 함수를 호출하고 결과를 저장하세요
// TODO: 결과를 출력하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.