スライスの長さをメソッド記法とドット記法で求めるときに(@Rust)

Beginning Rustの第18章の最初の方に出てくるコードですが、

fn main() {
    print!("{} {}",
        [1, 2, 3].len(),
        <[i32]>::len(&[1, 2, 3]));
}

ここで最後の2行はドット記法あるいはメソッド記法の違いですが、メソッド記法では<[i32]>::の表現が出てきます。ここで、<[i32]>の意味はスライスのジェネリック型でi32型の要素を持つこと、::はlen()の引数の型指定です。なぜこのような記法が必要かというと、len()というメソッドは他にもあって型を明示的に指定しないとどのトレイトに属するメソッドかを判断できないかから。

またlen()の引数は参照で無いとコンパイルできません。スライスのメソッドlen()の解説は以下の通り、

https://doc.rust-lang.org/std/primitive.slice.html#method.len

ここでa.len()を最後の行のように書き直してもコンパイルできます、スライスの要素はi8でもカバーされるので、

    let a = [1, 2, 3];
    assert_eq!(a.len(), 3);
    assert_eq!(<[i8]>::len(&a), 3);

ドット記法は実はこのような変換は暗黙で実行されています。それゆえ先のソースコードで、

&[1, 2, 3].len()のような冗長な記法でも問題ありません。ドット記法はRustの背後に存在するオブジェクト指向的な特性故に簡略な記法で使うことができます。

 

admin

カテゴリーRust