2011-01-16 20 views
2

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?

Antwort

1

Werfen Sie einen Blick auf Rubys coerce feature.

+0

Siehe auch [ "In Ruby, wie tatsächlich funktioniert zwingen?"] (Http://stackoverflow.com/questions/2799571/in-rubin-wie-macht-zwingt-tatsächlich-arbeiten) – Phrogz

Verwandte Themen