스트링 슬라이스는 String의 일부분에 대한 참조자이고, 아래와 같이 생겼다.
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
이는 전체 String의 참조자를 갖는 것과 비슷하지만 추가적으로 [0..5]
라는 코드가 붙어 있다. 전체 String에 대한 참조자 보다는, String의 일부분에 대한 참조자이다. start..end
문법은 start부터 시작하여 end를 포함하지 않는 연속된 범위를 기술한다.
러스트의 ..
범위 문법을 사용하여, 만일 첫번째 인덱스(즉 0)에서부터 시작하길 원한다면, 두 개의 마침표 전의 값은 생략할 수 있다.
let s = String::from("hello")
let slice = &s[0..2];
let slice = &s[..2];
비슷한 이치로, 만일 슬라이스가 String의 마지막 바이트까지 포함한다면 끝의 숫자를 생략할 수 있다.
let s = String::from("hello");
let len = s.len();
let slice = &s[3..len];
let slice = &s[3..];
전체 스트링의 슬라이스를 만들기 위해 양쪽 값을 모두 생략할 수 있다.
let s = String::from("hello");
let len = s.len();
let slice = &s[0..len];
let slice = &s[..];
스트링 슬라이스를 나타내는 타입은 &str
로 쓴다.
스트링 리터럴은 바이너리 안에 저장된다.
let s = "Hello, world!";
여기서 s의 타입은 &str
이다: 이것은 바이너리의 특정 지점을 가리키고 있는 슬라이스이다. 이는 왜 스트링 리터럴이 불변인가도 설명해준다. &str
은 불변 참조자이기 때문이다.
스트링 슬라이스는 스트링에 특정되어 있다. 더 일반적인 슬라이스 타입도 역시 있다.
let a = [1, 2, 3, 4, 5];
우리가 스트링의 일부를 참조하고 싶어할 수 있는 것처럼, 배열의 일부를 참조하고 싶을 수 있고, 그러면 아래와 같이 쓸 수 있다.
let a = [1, 2, 3, 4, 5];
let slice = &a[1..3];
이 슬라이스는 &[i32]
타입을 갖는다. 이는 스트링 슬라이스가 동작하는 방법과 똑같이, 슬라이스의 첫 번째 요소에 대한 참조자와 슬라이스의 길이를 저장한느 방식으로 동작한다.
다른 모든 종류의 컬렉션들에 대하여 이런 종류의 슬라이스를 이용할 수 있다.
참조: https://rinthel.github.io/rust-lang-book-ko/ch04-03-slices.html