Für eine Geometry-Bibliothek, die ich schreibe Ich möchte die Multiplikation von Vektoren durch Skalare unterstützen, einfach genug für vector * scalar
zu tun, indem Sie einfach die Vector#*
Methode definieren. Um jedoch scalar * vector
zu unterstützen, müssen alle Fixnum#*
, Bignum#*
und Float#*
Methoden affe-gepatcht werden. Ich verwende den folgenden Code für jede dieser Klassen zu erreichen, dass:Gibt es einen besseren Weg, um Rubys Basisklassen zu "affen"?
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
Ich frage mich, ob es einen besseren Weg, dies zu erreichen, oder wenn es irgendwelche möglichen Probleme mit diesem?
Siehe auch [ "In Ruby, wie tatsächlich funktioniert zwingen?"] (Http://stackoverflow.com/questions/2799571/in-rubin-wie-macht-zwingt-tatsächlich-arbeiten) – Phrogz