For a geometry library I'm writing I want to support multiplication of vectors by scalars, easy enough to do for vector * scalar
by just defining the Vector#*
method. However to support scalar * vector
all the Fixnum#*
, Bignum#*
and Float#*
methods have to be monkey-patched. I'm using the following code for each of these classes to accomplish that:
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
I'm wondering if there's any better way to accomplish this, or if there are any potential problems with doing this?
Take a look at Ruby's coerce feature.