2023. 6. 24. 00:37ㆍLanguage/Rust
러스트에서 문자열을 다룰 때는 String 타입 또는 &str 타입을 이용합니다.
&str은 변경이 불가능 하기 때문에 함수의 반환 값으로 사용해야 할 때는 String 타입을 사용하고 있습니다.
이 둘의 차이점에 대해 먼저 알아 보겠ㅅㅂ니다.
String 타입
String 타입은 벡터 타입입니다. 정확히는 vec<u8> 타입입니다. u8은 부호가 없는 8비트(1바이트) 정수이기 때문에 String 타입은 1바이트 단위로 데이터를 확장 할 수 있고, 벡터 타입은 힙 메모리에 저장됩니다.
&str 타입
&str 타입은 슬라이스라고 합니다. 큰따옴표("")로 감싼 문자열이 &str이며, 러스트에서는 슬라이스인 &[u8] 타입으로 취급됩니다. &[u8] 타입인 것을 보면 참조자로만 사용 할 수 있기 때문에 소유권이 없어 수정이 불가능 합니다.
문자열에서 문자 가져오기
C#이나 다른 언어에서는 아래와 같이 배열의 인덱스로 문자열에서 문자를 가져 올 수 있습니다.
string str= "hello";
Console.WriteLine($"{str[0]}");
하지만 Rust에서는 아래와 같이 작성하면 에러가 납니다.
fn main() {
let str = "hello";
println!("{}", str[0]);
}
error[E0277]: the type `str` cannot be indexed by `{integer}`
--> src/main.rs:3:24
|
3 | println!("{}", str[0]);
| ^ string indices are ranges of `usize`
|
= help: the trait `SliceIndex<str>` is not implemented for `{integer}`
= note: you can use `.chars().nth()` or `.bytes().nth()`
for more information, see chapter 8 in The Book: <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>
= help: the trait `SliceIndex<[T]>` is implemented for `usize`
= note: required for `str` to implement `Index<{integer}>`
For more information about this error, try `rustc --explain E0277`.
error: could not compile `string-test` (bin "string-test") due to previous error
Note 부분을 보면 str[0]과 같은 형태는 접근 할 수 없으니, 대신 chars 또는 bytes 메서드를 사용해서 접근하라고 컴파일러가 알려줍니다.
chars 메서드는 문자열을 UTF-8 기반으로 1글자 씩 분할한 반복자를 반환하고, bytes 메서드는 문자열을 단순히 1바이트 단위로 분할한 반복자를 반환합니다.
아까 위에서 봤듯이, Rust에서는 문자하나가 1바이트이기 때문에 bytes 메서드를 사용해서 1바이트를 가져오면 문자 1개가 됩니다.
fn main() {
let str = "hello";
let ch = str.chars().nth(0).unwrap();
println!("{}", ch);
let ch_byte = str.bytes().nth(0).unwrap();
println!("{}", String::from_utf8_lossy(&[ch_byte]));
}
위와 같이 문자 hello의 h를 출력 할 수 있습니다.
'Language > Rust' 카테고리의 다른 글
cargo diesel_cli 설치 에러 (0) | 2023.06.22 |
---|---|
환경변수 파일 읽기 (0) | 2023.06.21 |
Rust 명령줄의 인수 받기 (0) | 2023.06.18 |
Rust의 HashMap 소개 (1) | 2023.06.15 |
Rust Shuffle (0) | 2023.06.11 |