2001-11-22 (Thu) [長年日記]
_ Schwartzian Transform
ってのを試してみたら、
ary.collect {|i| [i.key1, i.key2, i]}.sort.collect {|j| j.last}
みたいな時に、最初のブロックのiが<=>を持ってないと、key1/key2が同じ値の要素があった時に、
test.rb:24:in `<=>': undefined method `<=>' for #<Foo:0x401b794c> (NoMethodError) from test.rb:24:in `sort' from test.rb:24
のようなエラーになってしまう。(当たり前か。)
<=>を定義せずに済ませることってできないかなあ。 たとえば、いくつかの属性を持つオブジェクトがあったとして、どの属性も重み(?)が同じだとすると、 デフォルトの<=>って定義したくないような気がするんだけど。 それにデフォルトの<=>があったとしても、上の例ではほんとは呼ぶ必要はない(配列に入れてるのは 比較に利用するためじゃなくて後で値を取り出すためだから)わけだし。
class STArray < Array attr_reader :value def initialize(value, *args) @value = value replace(args) end end ... p ary.collect {|i| STArray.new(i, i.key1, i.key2)}.sort.collect {|i| i.value}
くらいかなあ。ちょっとおおげさ?