その他のスライス
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 57/66。
文字列スライスは非常に便利ですが、スライスは文字列だけに限定されません。Rustのスライスの概念は、あらゆる要素のシーケンスに拡張されており、所有権を取得せずにコレクションを操作するための強力なツールとなっています。
配列やベクタからも、文字列で学んだのと同じ構文を使ってスライスを作成できます。例えば、数値の配列がある場合、その一部または全部を参照するスライスを作成できます。
let numbers = [1, 2, 3, 4, 5];
let slice: &[i32] = &numbers[1..4]; // これは [2, 3, 4] を返します
let full_slice: &[i32] = &numbers; // これは配列全体を参照します同じ原理がベクタにも当てはまります。ベクタからスライスを作成することで、データを移動したりコピーしたりすることなく、データの一部を操作できます:
let mut vec = vec![10, 20, 30, 40];
let vec_slice: &[i32] = &vec[0..2]; // これにより [10, 20] が得られますチャレンジ
簡単3つの入力を受け取ります。最初の入力はカンマ区切りの数値リストです。2番目の入力は、スライスを作成するための開始インデックスと終了インデックスを表す、スペースで区切られた2つの数値です。3番目の入力は、スライスからアクセスするインデックスを表す単一の数値です。
カンマ区切りの数値からベクトルを作成し、指定された範囲を使用してスライスを作成します。スライス内の指定されたインデックスにある要素にアクセスし、それを表示してください。
要件:
- 最初の入力(カンマ区切りの数値)を読み込み、空白をトリミングする
- 入力をカンマで分割し、各数値を
i32にパースする - これらの数値からベクトルを作成する
- 2番目の入力(スペースで区切られた2つの数値)を読み込み、空白をトリミングする
- 2番目の入力をスペースで分割して、開始インデックスと終了インデックスを取得する
- 両方のインデックスを
usizeにパースする - 範囲構文
&vec[start..end]を使用して、ベクトルからスライスを作成する - 3番目の入力(アクセスするインデックス)を読み込み、空白をトリミングする
- インデックスを
usizeにパースする - スライスの指定されたインデックスにある要素にアクセスする
- アクセスした要素を表示する
入力:
- 1行目: カンマ区切りの数値 (例:
10,20,30,40,50) - 2行目: スペースで区切られた2つの数値 (例:
1 4) - 3行目: インデックス番号 (例:
2)
出力:
- スライスの指定されたインデックスにある要素
チートシート
スライスは文字列だけでなく、配列やベクトルからも作成できます。これらは所有権を取得することなく、コレクションの一部を参照します。
配列からスライスを作成する:
let numbers = [1, 2, 3, 4, 5];
let slice: &[i32] = &numbers[1..4]; // [2, 3, 4] を参照
let full_slice: &[i32] = &numbers; // 配列全体を参照ベクトルからスライスを作成する:
let mut vec = vec![10, 20, 30, 40];
let vec_slice: &[i32] = &vec[0..2]; // [10, 20] を参照スライスは文字列スライスと同じ範囲構文を使用し、データを移動したりコピーしたりすることなく、データの一部を操作することを可能にします。
自分で試してみよう
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// 最初の入力を読み込む(カンマ区切りの数値)
let first_input = lines.next().unwrap().unwrap();
// 2番目の入力を読み込む(開始インデックスと終了インデックス)
let second_input = lines.next().unwrap().unwrap();
// 3番目の入力を読み込む(アクセスするインデックス)
let third_input = lines.next().unwrap().unwrap();
// TODO: 以下にコードを記述してください
// カンマ区切りの数値をパースしてベクトルを作成する
// 開始インデックスと終了インデックスをパースする
// ベクトルからスライスを作成する
// スライス内の指定されたインデックスにある要素にアクセスする
// 結果を出力する
// println!("{}", result);
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。