728x90
반응형
String slice
슬라이스를 사용하면 전체 컬렉션이 아닌 연속적인 요소 시퀀스를 참조할 수 있다. 슬라이스는 일종의 참조이므로 소유권을 갖지 않는다.
먼저 가장 간단한 형태의 slice를 살펴보자.
fn first_word(s: &String) -> usize {
let bytes = s.as_bytes();
// b' ' : 공백 byte값 32
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
s.len()
}
문장의 첫 번째 단어를 찾는 함수를 만들고 찾을 경우 해당 단어의 인덱스를 반환하는 형태로 구현했다. String 요소별로 살펴보고 값이 공백인지 확인해야 하므로 String을 사용하여 바이트 배열로 변환했다.
let bytes = s.as_bytes();
다음 iter 메서드를 사용하여 바이트 배열에 대한 반복자를 만든다. 이때 b' '는 공백값으로 byte에서 32를 나타낸다. 그러나 여기서는 인덱스만 반환할 뿐 해당 단어를 찾기 어렵다. 따라서 함수 내에서 공백이 나타난 위치까지 String을 나누어 실제 String 값을 반환할 수 있도록 해야 하고, 그러기 위해서 String slice라는 개념을 살펴보고 가겠다. 다른 언어에서의 개념과 크게 다르지 않기 때문에 특별한 설명을 생략한다.
let hello = &s[0..5];
println!("&s[0..5] : {}", hello);
let hello = &s[0..=4];
println!("&s[0..=4] : {}", hello);
let hello = &s[..5];
println!("&s[..5] : {}", hello);
let world = &s[6..];
println!("&s[6..] : {}", world);
String slice를 활용해 first_word 함수를 리팩토링할 수 있다.
fn first_word(s: &String) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[..i];
}
}
&s[..]
}
Other slice
다음과 같이 바로 slice해서 참조값으로 쓸 수 있다.
let a = [1,2,3,4,5];
let slice = &a[1..3];
assert_eq!(slice, &[2,3]);
728x90
반응형
'Language > Rust' 카테고리의 다른 글
[Rust]Method syntax (0) | 2022.12.28 |
---|---|
[Rust]Structure 구조체 (0) | 2022.12.28 |
[Rust]소유권 - referrence, borrowing (0) | 2022.12.28 |
[Rust]Ownership 소유권 (0) | 2022.12.23 |
[Rust]Control Flow 제어문 (0) | 2022.12.22 |