7

数値の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に適している可能性があることに気付きました。それに応じて自由に移行してください...

4

2 に答える 2

9

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

したがって、変更をNumericにパッチして、一度にすべてをカバーします。

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

次に、これらのことを行うことができます。

>> 11.root(2) # Integer
=> 3.3166247903554
>> 2.18.root(3) # Float
=> 1.296638256974172
>> Rational(23, 42).root(6) # Rational
=> 0.9045094132598528
>> 2**1000.root(42) # Integer
=> 2.2638347236157763
于 2012-05-03T21:06:35.150 に答える
9

#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

このブログ投稿を参照してください。

または、モジュールを作成して各クラスに含めることもできます。

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

class Fixnum
  include MyRoot
end

class Float
  include MyRoot
end

私は後者に傾いています。何をしているのかが明確になり、1回限りの追加も可能になります。

于 2012-05-03T20:52:02.570 に答える