トップ «前の日記(2001-11-21 (Wed)) 最新 次の日記(2001-11-26 (Mon))» 編集   RSS 1.0 FEED  

Journal InTime


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}

くらいかなあ。ちょっとおおげさ?