さび-スライス

スライスは、メモリのブロックへのポインタです。スライスを使用して、連続するメモリブロックに格納されているデータの一部にアクセスできます。配列、ベクトル、文字列などのデータ構造で使用できます。スライスは、インデックス番号を使用してデータの一部にアクセスします。スライスのサイズは実行時に決定されます。

スライスは実際のデータへのポインタです。これらは、借用とも呼ばれる関数への参照によって渡されます。

たとえば、スライスを使用して文字列値の一部をフェッチできます。スライスされた文字列は、実際の文字列オブジェクトへのポインタです。したがって、文字列の開始インデックスと終了インデックスを指定する必要があります。インデックスは、配列と同じように0から始まります。

構文

let sliced_value = &data_structure[start_index..end_index]

最小インデックス値は0で、最大インデックス値はデータ構造のサイズです。end_indexは最終文字列に含まれないことに注意してください。

次の図は、9文字のサンプル文字列Tutorialsを示しています。最初の文字のインデックスは0で、最後の文字のインデックスは8です。

次のコードは、文字列から5文字をフェッチします(インデックス4から開始)。

fn main() {
   let n1 = "Tutorials".to_string();
   println!("length of string is {}",n1.len());
   let c1 = &n1[4..9]; 
   
   // fetches characters at 4,5,6,7, and 8 indexes
   println!("{}",c1);
}

出力

length of string is 9
rials

イラスト-整数配列のスライス

main()関数は、5つの要素を持つ配列を宣言します。それはを呼び出しますuse_slice()関数を実行し、3つの要素のスライスを渡します(データ配列を指します)。スライスは参照によって渡されます。use_slice()関数は、スライスの値とその長さを出力します。

fn main(){
   let data = [10,20,30,40,50];
   use_slice(&data[1..4]);
   //this is effectively borrowing elements for a while
}
fn use_slice(slice:&[i32]) { 
   // is taking a slice or borrowing a part of an array of i32s
   println!("length of slice is {:?}",slice.len());
   println!("{:?}",slice);
}

出力

length of slice is 3
[20, 30, 40]

可変スライス

ザ・ &mut キーワードを使用して、スライスを変更可能としてマークできます。

fn main(){
   let mut data = [10,20,30,40,50];
   use_slice(&mut data[1..4]);
   // passes references of 
   20, 30 and 40
   println!("{:?}",data);
}
fn use_slice(slice:&mut [i32]) {
   println!("length of slice is {:?}",slice.len());
   println!("{:?}",slice);
   slice[0] = 1010; // replaces 20 with 1010
}

出力

length of slice is 3
[20, 30, 40]
[10, 1010, 30, 40, 50]

上記のコードは、可変スライスをuse_slice()関数に渡します。この関数は、元の配列の2番目の要素を変更します。