러스트에서 문자열 선언에는 여러 방법이 있습니다.
let mut s = String::new(); // 비어있는 문자열 생성
let data = "initial contents";
let a = data.to_string();
let b = "initial contents".to_string(); // 3, 4라인과 동일
let c = String::from("initial contents"); // 위와 동일
to_string과 String::from은 모두 리터럴로부터 스트링을 생성하는 같은 일을 합니다. 어떤 것을 사용하는가는 코더의 스타일에 따라 사용하시면 됩니다.
문자열 추가
let mut s = String::from("foo");
s.push_str("bar");
push_str로 foo 뒤에 bar를 추가할 수 있습니다.
let mut s = String::from("lo");
s.push('l');
push 또한 사용가능합니다.
두 문자열의 합
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; // s1은 여기서 이동되어 더이상 쓸 수 없음을 유의하세요
+ 연산을 통해 두 문자열을 하나로 합할 수 있습니다.
여기서 s1은 소유권을 잃어 더 이상 사용할 수 없고 s2에서 참조자가 사용된 이유는 +연산의 시그니쳐를 맞춰야 하기 때문이기도 하며 러스트에서 두 String의 add 연산을 하지 못합니다.
fn add(self, s: &str) -> String { // +연산
하지만 더해야 할 문자열의 개수가 늘어난다면 상당히 불편해집니다.
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = s1 + "-" + &s2 + "-" + &s3;
더해야 하는 문자열의 수가 늘어난다면 format! 매크로를 이용하면 편리하게 문자열을 더할 수 있습니다.
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{}-{}-{}", s1, s2, s3); //String 반환
format! 은 println! 과 똑같은 방식으로 작동하지만 출력하는 대신에 String을 반환해줍니다.
문자열 접근
러스트에서는 문자열에 인덱스로 접근하는 것을 허용하지 않습니다.
let hello = "Здравствуйте";
let answer = &hello[0]; //error
러스트에서는 문자열을 슬라이싱할 때 문자의 개수 단위로 구분하는 것이 아닌 바이트 단위로 구분하기 때문에 문자열의 인덱싱 리턴 타입이 어떤 것인지 명확하지 않기 때문에 지원하지 않습니다.
만약 정말로 인덱스를 사용해야 한다면 범위를 지정해서 사용이 가능합니다.
let hello = "Здравствуйте";
let s = &hello[0..4];
파이썬이라면 [0:4]의 문자열을 슬라이싱 하면 "Здра"이 반환되겠지만 러스트에서는 "Зд"가 반환됩니다. 한 문자당 2바이트로 계산되기 때문입니다.
만약 [0..1]로 적었다면 패닉을 발생시킬 것입니다.
thread 'main' panicked at 'index 0 and/or 1 in `Здравствуйте` do not lie on
character boundary', ../src/libcore/str/mod.rs:1694
다행히도 chars 메소드를 통한 접근이 가능합니다.
for c in "नमस्ते".chars() {
println!("{}", c);
}
न
म
स
्
त
े
'Rust' 카테고리의 다른 글
[Rust] 벡터 (0) | 2022.04.27 |
---|---|
[Rust] 해쉬맵 (hash map) (0) | 2022.04.26 |
[Rust] Option 과 Result (0) | 2022.04.25 |
[Rust] match 흐름 제어 연산자 (0) | 2022.04.24 |
[Rust] enum 열거형 (0) | 2022.04.23 |