Rustのedition(@Rust)

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

カテゴリーRust