スライス
借用したビュー
「スライス」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
スライスとは
スライスは、コレクションの連続した一部分を借用して参照するものです。データを所有せず、既存のデータを指し示します。
スライスは、角括弧内に範囲を指定して記述します。
fn main() {
let arr = [1, 2, 3, 4, 5];
let part = &arr[1..4];
println!("{:?}", part);
}スライスの範囲構文
範囲では開始インデックスと終了インデックスを指定します。終了位置は含まれません。
&v[1..4]— インデックス1、2、3。&v[..3]— 先頭から3まで。&v[2..]— 2から末尾まで。
fn main() {
let v = vec![10, 20, 30, 40];
println!("{:?}", &v[..2]);
println!("{:?}", &v[2..]);
}文字列スライス
文字列スライス&strは、Stringの一部分を参照するビューです。インデックスの範囲はバイト位置で指定します。
fn main() {
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
println!("{} {}", hello, world);
}コレクション全体のスライス
&v[..]を使うと、コレクション全体をスライスできます。これにより、Vecをスライスとして借用できます。
fn main() {
let v = vec![1, 2, 3];
let whole = &v[..];
println!("{:?}", whole);
}パラメーターとしてのスライス
&[T]を受け取る関数は、配列とベクターの両方を受け入れます。そのため、柔軟に使えます。
fn sum(items: &[i32]) -> i32 {
let mut total = 0;
for x in items {
total += x;
}
total
}
fn main() {
let v = vec![1, 2, 3];
let a = [4, 5, 6];
println!("{} {}", sum(&v), sum(&a));
}スライスは借用するが所有しない
スライスは借用するものなので、スライスの使用中は元のコレクションが存続していなければなりません。これをコンパイラーが強制します。
fn main() {
let v = vec![100, 200, 300];
let s = &v[0..2];
println!("slice {:?}, original {:?}", s, v);
}スライスの長さ
ほかのコレクションと同様に、スライスには対象とする要素数を返すlen()メソッドがあります。
fn main() {
let v = vec![5, 6, 7, 8, 9];
let middle = &v[1..4];
println!("length {}", middle.len());
}firstとlast
スライスにはfirst()とlast()があり、空のスライスも安全に扱えるようにOptionを返します。
fn main() {
let data = [10, 20, 30];
let s = &data[..];
println!("{:?} {:?}", s.first(), s.last());
}スライスを反復処理する
他のコレクションと同じように、スライスも反復処理できます。
fn main() {
let v = vec![1, 2, 3, 4];
for x in &v[1..3] {
println!("{}", x);
}
}最初の単語を返す関数
スライスの一般的な用途は、既存のテキスト内のスライスを返すことです。たとえば、文の最初の単語を返せます。
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &b) in bytes.iter().enumerate() {
if b == b' ' {
return &s[0..i];
}
}
s
}
fn main() {
println!("{}", first_word("hello there"));
}スライスが安全な理由
スライスはデータのコピーを避けながら、ダングリング参照を防ぎます。借用チェッカーが、元のデータがスライスより長く存続することを保証します。
fn main() {
let words = vec!["a", "b", "c", "d"];
let pair = &words[1..3];
println!("{:?}", pair);
}簡単な確認
スライスが何を表すのか思い出してください。
まとめ
Rustのスライス:
- 借用したビュー:
&v[start..end]。endは含まれません。 &strは文字列スライス、&[T]は配列またはベクターのスライスです。- スライスをパラメーターにすると、配列とベクターの両方を受け取れます。
- 借用チェッカーがスライスの安全性を保ちます。
fn average(nums: &[i32]) -> i32 {
nums.iter().sum::<i32>() / nums.len() as i32
}
fn main() {
let v = vec![4, 8, 12];
println!("{}", average(&v[..]));
}よくある質問
「スライス」レッスンは無料ですか?
はい。「スライス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「スライス」で何を学びますか?
借用したビュー ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「スライス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。