std::i32::MAX vs i32::max_value()
fn main () { println!("{}", std::i32::MAX); println!("{}", i32::max_value()); }
どちらも合法で 2147483647
を印字する
重複した役割のものがなぜ存在するのかなーと思ってちょっと調べていたことをメモ
モジュールか型か
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と同様にジェネリクスで扱いたい場合、
numクレートに最大値最小値を返す関数を要請するトレイトがあるので、
これに適合させることで
fn hoge<T: num::Bounded + Display>(value: T) { println!("{}/{}", value, T::max_value()); }
みたいなジェネリックな関数を書くときに役立つかもしれない
associated constantsを使うバージョンだとこういうことはできない・・・気がする