std::i32::MAX vs i32::max_value()

fn main () {
    println!("{}", std::i32::MAX);
    println!("{}", i32::max_value());
}

Rust Playground

どちらも合法で 2147483647を印字する

重複した役割のものがなぜ存在するのかなーと思ってちょっと調べていたことをメモ

モジュールか型か

github.com

MAXはmoduleで、max_valueはtypeに実装されてる、という本質情報があった

確かに、

fn main () {
    println!("{}", i32::MAX); 
    println!("{}", std::i32::max_value()); 
}

コンパイルしない

定数か関数か

そもそも、
std::i32::MAXは定数(associated constants)だし,
i32::max_value()は関数。

同じ値が返るので気にする場面は限られているが、
その限られた場合っていうのは例えば、自分で数値型(やなにか最小値最大値があるような数値っぽいもの)を定義してprimitive typeのintegerと同様にジェネリクスで扱いたい場合、

rust-num.github.io

numクレートに最大値最小値を返す関数を要請するトレイトがあるので、
これに適合させることで

fn hoge<T: num::Bounded + Display>(value: T)  {
  println!("{}/{}", value, T::max_value());
}

みたいなジェネリックな関数を書くときに役立つかもしれない
associated constantsを使うバージョンだとこういうことはできない・・・気がする