17.3 Strings
Rust에는 두 타입의 string이 있다: String과 &str.
String은 바이트들의 벡터로 저장되고(Vec<u8>) 검증된 UTF-8 형태라고 보장하지 않는다. String은 힙에 할당되고, 확장 가능하지만 null로 끝을 맺지 않는다.
&str은 조각으로(&[u8]) 항상 검증된 UTF-8 형태를 지칭하고, &[T]이 Vec<T>로 보이는 것처럼 String으로 사용되 보여줄 수 있다.
fn main() {
// (모든 타입 주해는 꼭 필요하진 않다)
// 일기 전용 메모리에 할당된 string 참조.
let pangram: &'static str = "the quick brown fox jumps over the lazy dog";
println!("Pangram: {}", pangram);
// 단어들을 역순으로 나열, 새 string이 할당되지 않는다.
println!("Words in reverse");
for word in pangram.split_whitespace().rev() {
println!("> {}", word);
}
// 문자들을 벡터로 복사하고, 정렬 및 중복 삭제.
let mut chars: Vec<char> = pangram.chars().collect();
chars.sort();
chars.dedup();
// 비어있으면서 확장 가능한 `String` 생성.
let mut string = String::new();
for c in chars {
// char를 string의 끝에 삽입
string.push(c);
// string의 끝에 string 삽입
string.push_str(", ");
}
// 다듬어진 string은 원본의 조각이고, 새 할당은 되지 않았다.
let chars_to_trim: &[char] = &[' ', ','];
let trimmed_str: &str = string.trim_matches(chars_to_trim);
println!("Used characters: {}", trimmed_str);
// string 힙 할당.
let alice = String::from("I like dogs");
// 수정된 string을 보관하기 위한 새 메모리 할당.
let bob: String = alice.replace("dog", "cat");
println!("Alice says: {}", alice);
println!("Bob says: {}", bob);
}str/String 메소드는 아래에서 더 찾아볼 수 있다.
std::str 과 std::string 모듈.