おことわり
筆者は数学的知見に乏しく、専門的な解説としては不備があります。
数学的解説としてではなく、意味の把握程度に目を通して頂ければ幸いです
概要
Ord は全順序集合(Total Order)、
PartialOrd は半順序集合(Partial Order)を指しています。
数学的な証明は置いといて、ざっくり何が違うのかと言うと
・任意の要素 全て が 比較可能 であるか(Ord)
・比較不可能か (Partial_Ord)
といった違いが存在します
以下で実際のソースを見てみましょう
例
Ordトレイトを実装している i32 と
PartialOrdトレイトしか実装されていない f64 にて例を示してみます。
// i32の場合
fn main(){
let val:i32 = 15;
let v = vec![15,32,22,35,92,0];
//どんな要素を選んでも比較可能
println!("{},{},{}",val<=15,val>=15,val<=std::i32::MAX);
//Ordが実装されているので、Iterator::max()等も使える
println!("{}",v.iter().max().unwrap());
}
一方、f64になると
fn main(){
let val:f64 = 1.2;
let v:Vec<f64> = vec![15.0,32.0,22.0,35.0,92.0,0.0];
//表現可能な数値は比較可能だが…
println!("{},{},{}",val<=5.3,val>=2.4,val<=std::f64::MAX);
//NANとの正しい比較が行えない
println!("{},{},{}",val<=std::f64::NAN,val>=std::f64::NAN,val==std::f64::NAN);
//Ordが実装されていないので、Iterator::max()等は使えない
//println!("{}",v.iter().max().unwrap());
}
となり、f64ではNANとの正しい比較が不可能なためOrdの要件を満たせなくなります。
このように、比較不可能な要素が存在するorしないが
PartialOrdとOrdの主な違いです
#最後に
(大切な事なので)もう一度言うと
・Ord は、どのような要素を選んでも 比較可能 な型に
・PartialOrdは、比較不可能 な要素が存在する型に
実装されています
#参考
・Rustで競技プログラミング スターターキット(@hatoo@githubさん)
→PartialOrdの解説と、NANを受け取った時にパニックを起こすOrdトレイトラッパの実装が紹介されています。
・Rustでf32やf64の配列の最大値を得る方法(@lo48576さん)
→f32/64配列の最大値を取得する方法が解説されています。
どちらの記事も非常に参考になる内容でしたので、是非一読されることを
オススメします