English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Rust Slice(スライス)型

スライス(Slice)はデータ値の一部の参照です。

スライスという名前は生物の授業でよく聞きます。私たちは標本の切片を作成して、顕微鏡で観察するために生物体から切片を取り出します。Rustでは、スライスの意味は大まかに同じですが、データから引用しています。

文字列スライス

最もシンプルで最も一般的なデータスライスの型は文字列スライス(String Slice)です。

fn main() {
    let s = String::from("broadcast");
    let part1 =&s[0..5];
    let part2 = &s[59];
    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 部分引用され、値の変更は禁止です。

実際には、今までのところ、文字列を使用するたびにこんな風に書く理由がわからないかもしれませんString::from("w"}})3codebox") ,直接書 "w3codebox" できますか?

これで、私たちはこの二つの概念の違いを区別する必要があります。Rust には、str と String の二つの一般的な文字列型があります。str は Rust の核心言語型で、この章で何度も話している文字列スライス(String Slice)です。通常、参照の形で現れます(&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