2

私が書いているジオメトリ ライブラリでは、スカラーによるベクトルの乗算をサポートしたいと考えています。これは、メソッドvector * scalarを定義するだけで簡単に実行できます。Vector#*ただし、scalar * vectorすべてのFixnum#*Bignum#*およびFloat#*メソッドをサポートするには、モンキー パッチを適用する必要があります。それを達成するために、これらの各クラスに次のコードを使用しています。

class Fixnum
  old_times = instance_method(:'*')

  define_method(:'*') do |other|
    case other
    when Geom3d::Vector
      Geom3d::Vector.new(self * other.dx, self * other.dy, self * other.dz)
    else
      old_times.bind(self).(other)
    end
  end
end

class Bignum
  #...
end

class Float
  #...
end

これを達成するためのより良い方法があるかどうか、またはこれを行う際に潜在的な問題があるかどうか疑問に思っていますか?

4

2 に答える 2

1

Ruby の強制機能を見てみましょう。

于 2011-01-16T23:24:21.733 に答える
1

#強要したい

何かのようなもの

class Geom3d::Vector
    def coerce(right_hand_side)
       self,right_hand_side
    end
end

http://corelib.rubyonrails.org/classes/Vector.html

于 2011-01-16T23:27:39.330 に答える