スライスとは?
配列、ベクター、文字列などの一部の要素への参照のこと
このスライスを利用することで、無駄に使用メモリを増やすことなく、利用したい特定の要素のみにアクセス or 値の更新ができる
値の更新は「可変スライス」という利用方法がある
例としてはこんな感じ
let mut array = [1, 2, 3, 4, 5];
let slice = &mut array[1..4]; // 2, 3, 4
for elem in slice.iter_mut() {
*elem *= 2;
}
println!("{:?}", array); // [1, 4, 6, 8, 5]
スライス自体は、あくまで借用であるのでメモリ自体に値をもっていない。あくまで借用した親元のアクセス先を知っているだけの状態
値の更新をしたいならば、可変な参照として渡せばok
&mut として指定すること
スライスの位置の指定方法
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
最初の0を省略すると、頭から指定したことになる。終端の値を省略すると最後の値を指定したことになる
注意点?Rustの素晴らしいところ
fn main() {
let mut s = String::from("hello world");
let word = first_word(&s);
s.clear(); // error! (エラー!)
println!("the first word is: {}", word);
}
let word の部分で文字列スライスを作成している。これは言うなれば、不変な参照をしていることと一緒である。ゆえに、s.clear() は sの値を更新しようとしているのでコンパイルエラーとなる
どこかしらで参照をした場合は、それ以降に参照した親元の値の不用意な更新はできなくなるということ。かっちりしてるなーRust
でも、まだまだ全然分からない。どんどんコード書いていかないとだけど、ひとまずは少しずつチュートリアルを進めていく
借用規則から、何かへの不変な参照がある時、さらに可変な参照を得ることはできないことを思い出してください。 clearはStringを切り詰める必要があるので、可変な参照を得る必要があります。Rustはこれを認めないので、コンパイルが失敗します。 RustのおかげでAPIが使いやすくなるだけでなく、ある種のエラー全てを完全にコンパイル時に排除してくれるのです!