【发布时间】:2010-12-23 16:14:03
【问题描述】:
为了娱乐目的,我一直在玩弄 ruby 和 opengl,我决定编写一些 3d 矢量/平面/等类来完善一些数学。
简化示例:
class Vec3
attr_accessor :x,:y,:z
def *(a)
if a.is_a?(Numeric) #multiply by scalar
return Vec3.new(@x*a, @y*a, @z*a)
elsif a.is_a?(Vec3) #dot product
return @x*a.x + @y*a.y + @z*a.z
end
end
end
v1 = Vec3.new(1,1,1)
v2 = v1*5 #produces [5,5,5]
这一切都很好,花花公子,但我也希望能够写作
v2 = 5*v1
这需要向 Fixnum 或 Float 或其他任何内容添加功能,但我无法找到一种方法来重载或扩展 fixnum 的乘法而不完全替换它。这可能在红宝石中吗?有什么建议吗?
(显然,如果需要,我可以按正确的顺序编写所有乘法)
【问题讨论】:
-
为了记录,把
@x*s, @y*s, @z*s改成@x*a, @y*a, @z*a,否则你的代码就坏了。 -
谢谢,一次从 2 个地方复制代码 >
标签: ruby operators operator-overloading overloading