English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
쪼개기(Slice)는 데이터 값의 일부 참조입니다.
쪼개기라는 이름은 생물학 시간에 자주 등장합니다. 우리는 显微镜에서 관찰하기 위해 생물체에서 쪼개기를 가져옵니다. Rust에서는 쪼개기라는 것은 데이터에서 재료를 가져오는 것을 의미하지만, 의미는 비슷합니다.
가장 간단하고 일반적으로 사용되는 데이터 쪼개기 타입은 문자열 쪼개기(String Slice)입니다.
fn main() { let s = String::from("broadcast"); let part1 = &s[0..5]; let part2 = &s[5..9]; println!("{}={}+{}", s, part1, part2); }
실행 결과:
broadcast=broad+cast
위 그림은 문자열 쪼개기 원리를 설명합니다(주의: Rust의 문자열 타입은 실제로 메모리에서 문자의 시작 위치와 길이를 기록합니다. 이 점은 일시적으로 이해하겠습니다.).
범위 표현법은 반복 단원에서 등장했습니다.x..y 를 나타냅니다 [x, y) 의 수학적 의미. .. 양쪽에 연산자가 없을 수 있습니다:
..y는 0..y와 동일합니다 x..는 위치 x부터 데이터 끝까지와 동일합니다 ..는 위치 0부터 끝까지와 동일합니다
주의:현재까지는 문자열에서 영문자 이외의 문자를 사용하지 않도록 해주세요. 인코딩 문제로 인해 그 이유는 "문자열" 단원에서 설명됩니다.
부분으로 쪼개진 문자열의 값을 변경할 수 없습니다:
fn main() { let mut s = String::from("w3codebox"); let slice = &s[0..3]; s.push_str("yes!"); // 오류 println!("slice = {}", slice); }
이 프로그램이 올바르지 않습니다.
s 을 일부 인용하여 값을 변경할 수 없습니다.
실제로, 현재까지 매번 문자열을 사용할 때 이렇게 써야 하는 이유에 대해 당신은 의심할 수 있습니다.3codebox")를 직접 써야 합니다. "w3codebox" 안 될까요?
이제 이 두 개념의 차이를 구분해야 합니다. Rust에서 두 가지 일반적인 문자열 타입이 있습니다: str과 String. str은 Rust 핵심 언어 타입으로, 이 장에서 언급한 문자열 슬라이스(String Slice)입니다. often appears as a reference (&str).
양쪽 쌍따옴표로 포함된 문자열 상수의 전체 타입 성질은 &str:
let s = "hello";
여기서 s는 &str 타입의 변수입니다.
String 타입은 Rust 표준 공용 라이브러리에서 제공하는 데이터 타입으로, 기능이 더 완벽합니다. 그것은 문자열에 추가, 비우기 등 실용적인 연산을 지원합니다. String과 str은 문자열의 시작 위치 속성과 문자열 길이 속성 외에도 용량(capacity) 속성을 가집니다.
String과 str은 슬라이스를 모두 지원하며, 슬라이스 결과는 &str 타입의 데이터입니다.
주의: 슬라이스 결과는 참조 타입이어야 하지만, 개발자는 이 점을 명시해야 합니다:
let slice = &s[0..3];
String을 &str로 변환하는 빠른 방법이 있습니다:
let s1 = String::from("hello"); let s2 = &s1[..];
문자열 이외에도, 일부 선형 데이터 구조는 슬라이스 연산을 지원합니다. 예를 들어, 배열:
fn main() { let arr = [1, 3, 5, 7, 9]; let part = &arr[0..3]; for i in part.iter() { println!("{}", i); } }
실행 결과:
1 3 5