その他のスライス
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)
出力:
- スライス内の指定されたインデックスにある要素
自分で試してみよう
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);
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。