それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rubyのハッシュの値から最大値を求める方法(最小値も)

Hash.maxがそのままだと、キーの最大値を返す。

rubyのHashはmax()でキーの最大値を求めてくるので困ります.
そこで値から最大値を求めるようにします.

h.max { |a, b| a[1] <=> b[1] }

でValueの最大値が返ってくる.便利ね.

最小値も同じ

h.min { |a, b| a[1] <=> b[1] } 

デフォルト動作では

h.max { |a, b| a <=> b }

のように動いているっぽい

Array/Enumerable ではデフォルトの比較で問題ない。しかしHashだと意図したとおり動かない.Hashではが a,b が配列になる。なのでHashでmaxが誤作動する

h.max { |a, b| a <=> b }# Hashの場合 a=>[key,value], b=>[key,value]

になっている。Ruby1.8だけの問題なのですかね。本家で修正してほしいと思うくらい紛らわしい。まぁユーザー側で組み込みクラスの動作変えられるから問題ないんですね。Ruby楽しいね.

組み込みのHash動作を変えてみる

class Hash 
  def max(&block)
 #よくわからん
  end
end

《 <=> 》←この演算子はなに?

とってつけたような <=> 演算子はナニカ

p(3 <=> 5) #=> -1

基本的な比較演算子。ほかの比較演算子はこの演算子を元にComparableモジュールで定義されています。
左が大きければ1、等しければ0、右が大きければ-1を返すように作ることが期待されています。

試してみた.
?> 1<=>2
=> -1
>> 1<=>1
=> 0
>> 2<=>1
=> 1