Rustもそこそこ年代を重ねてきているので、editionによる互換性問題は出てきています。Beginning Rustの以下のコードはedition=2021と指定しないとコンパイルが通りません。
$ rustc –edition=2021 main.rs (=ではなくスペースでも同じ)
Cargoを使っていれば、cargo.tomlにエディション指定(デフォルトは2021)しておけば問題ないですが
/* It prints:
11 21 31 */
fn main() {
let array_iterator: std::array::IntoIter<i32, 3_usize>
= [10, 20, 30].into_iter();
for item in array_iterator {
let j: i32 = item;
print!("{} ", j + 1);
}
}
ここでarray_iteratorの型は、https://doc.rust-lang.org/std/array/struct.IntoIter.html
の通りですが、ここでは説明用に型を指定しているだけで、省略してもコンパイラが解釈できます。ここで3_usizeという見慣れない表記が出てきますが、ここで’_’は見やすさのためのスペーサーで3usizeの記法でも構いません。
ここで配列がイテレーターを返せる訳は、イテレーターを返すinto_iter()関数を実装しているからです。
この辺りの仕様はeditionにより変わるようで、以下に記載があります。
https://doc.rust-jp.rs/edition-guide/rust-2021/IntoIterator-for-arrays.html
該当部分は”
- Rust 2021 から、
array.into_iter()
がIntoIterator::into_iter
を意味するように変更されます。
”
従って、2021以前のeditionでコンパイルするためには以下のようなコードになります。
fn main() {
let array_iterator: std::array::IntoIter<i32, 3_usize>
= IntoIterator::into_iter([10, 20, 30]);
for item in array_iterator {
let j: i32 = item;
print!("{} ", j + 1);
}
}
admin