dポイントプレゼントキャンペーン実施中!

rubyでは<や>などの比較演算子もメソッドと分類されるのでオーバーライドが可能と認識しております。具体的にどのようにコーディングしたら良いのでしょうか?

例えば、配列に数値が格納されているとします。
array=[3,5,4,2,1]
この配列をソートした場合に比較が何回行われたかをカウントしたいです。
p array.sort

>や<が再定義可能なら、比較演算子が呼ばれる度にカウンターアップするなどと言う事はできるような気がするのですが、どうコーディングしてよいか解りません。
rubyのマニュアルも読んだし、それなりに検索でも頑張ったのですが、煮詰まってしまいました。

ご指導のほど、よろしくお願いいたします。

A 回答 (2件)

クラス変数を定義します。


単に再定義するには、必要ないですが、
元のメソッドを利用したい場合は、alias しておきます。

#!/usr/bin/ruby
# coding: utf-8
class Fixnum
@@counter = 0
alias orig_compare <=>
def <=>(other)
@@counter += 1
orig_compare(other)
end
def counter
@@counter
end
end

a = [3, 5, 4, 2, 1]
p a.sort, 0.counter

結果:
[1, 2, 3, 4, 5]
7
    • good
    • 0
この回答へのお礼

MillenniuMさん、ご回答ありがとうございました。

大変参考になりました。

お礼日時:2013/12/20 00:36

こういう感じでしょうか。



#!/usr/bin/ruby
# coding: utf-8
a = [3, 5, 4, 2, 1]
@c = 0
p a.sort_by{|e| @c += 1; e}, @c
@c = 0
p a.sort{|x, y| @c += 1; x <=> y}, @c

結果:
[1, 2, 3, 4, 5]
5
[1, 2, 3, 4, 5]
7
    • good
    • 0
この回答へのお礼

MillenniuMさん、ご回答ありがとうございます。

これで知りたかった事は知れたのですが、これで自信の本当の目的は達成できたのですが、
メソッドのオーバライドってどうやるの? って質問としたので、もうすこし質問は開いておかせてください。

しかしながら、とても参考になりました。ありがとうございます。難しく考えてました。

お礼日時:2013/12/19 23:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!