そしてmy_iter()の関数をVec<i32>に対して実装します
まず以下のtraitの部分は今回おまじないとして無視していいです
trait MyIterTrait {
fn my_iter(self) -> MyIter;
}
次が関数my_iter()のVec<i32>に対する実装(impl)です
impl MyIterTrait for Vec<i32> {
fn my_iter(self) -> MyIter {
MyIter { vec: self, index: 0 }
}
}
このように関数my_iter()は>>75で定義した構造体MyIterを返しているだけです
アセンブリコードはC言語などと同じになるでしょう
ただしC言語では構造体はポインタ返しのみだったと思いますが
Rustでは構造体をそのまま返せてこれはスタック領域にデータが返ります
あとは冒頭に説明しましたイテレータとして機能するためのnext()が必要です
構造体MyIterに対してイテレータの実装(impl)をします
impl Iterator for MyIter {
type Item = i32;
fn next(&mut self) -> Option<i32> {
if self.index < self.vec.len() {
let ret = self.vec[self.index];
self.index += 1;
Some(ret)
} else {
None
}
}
}
ベクタの現在のインデックス値を Some(ret) と返しているだけです
インデックスがベクタの長さを超えたら None を返しています
C vs C++ vs Rust Part.2
■ このスレッドは過去ログ倉庫に格納されています
2021/12/17(金) 23:19:50.48ID:M1BnXuWN
■ このスレッドは過去ログ倉庫に格納されています
