2012-05-03 22 views
6

数字のn番目のルートを計算するコードがあります。現在、このメソッドはFixnumクラスでのみ定義されているため、Fixnumでのみ機能します。複数のクラスに同じメソッドを追加

class Float 
    #same code as was in Fixnum 
end 

しかし、これは不必要なようです。動的にクラスを呼び出す方法はわかりません。私は試みた:

classes = [Fixnum, Float] 
classes.each do |x| 
    x.instance_eval do 
     def root(pow) 
      return self ** (1/pow.to_f) 
     end 
    end 
end 

しかし、それは動作しませんでした。これはどうすればいいですか? 注::転記後、私はこれがProgrammers.SEの方が理にかなっていると認識しました。 ...それに応じて移行してお気軽

+2

注意を上記の 'return'では必要ではない(そして非慣用的)。 – Phrogz

答えて

8

クラス階層の関連部分は次のようになります。

だから、一度にすべてをカバーするために、数値にあなたの変更をパッチ:

class Numeric 
    def root(pow) 
    return self ** (1/pow.to_f) 
    end 
end 

その後、あなたはこれらの事を行うことができます。

>> 11.root(2) # Fixnum 
=> 3.3166247903554 
>> 2.18.root(3) # Float 
=> 1.296638256974172 
>> Rational(23, 42).root(6) # Rational 
=> 0.9045094132598528 
>> 2**1000.root(42) # Bignum 
=> 2.2638347236157763 
7

あなたが#class_eval使用することをお勧めします:

classes = [Fixnum, Float] 
classes.each do |x| 
    x.class_eval do 
     def root(pow) 
      return self ** (1/pow.to_f) 
     end 
    end 
end 

基準としてthis blog postを参照してください。

代わりに、モジュールを作成し、各クラスにそれを含めることができます

module MyRoot 
    def root(pow) 
    return self ** (1/pow.to_f) 
    end 
end 

class Fixnum 
    include MyRoot 
end 

class Float 
    include MyRoot 
end 

私は後者の方に傾きます。それはあなたがやっていることを明確にして、ワンオフの追加も可能にします。

+0

+1は一般的には正解ですが、-1は実際の必要性のための正しい答えを持っていないためです:数値から継承します。 – Phrogz

関連する問題