gpt4 book ai didi

ruby 运算符重载问题

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:03 25 4
gpt4 key购买 nike

出于娱乐目的,我一直在摆弄 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 的乘法而不完全替换它。这在 ruby 中可能吗?有什么建议吗?

(显然,如果需要的话,我可以按正确的顺序写出所有的乘法)

最佳答案

使用强制是比猴子修补核心类更好的方法:

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

def coerce(other)
return self, other
end
end

如果您将 v 定义为 v = Vec3.new,则以下内容将起作用:v * 55 * vcoerce (self) 返回的第一个元素成为操作的新接收者,第二个元素 (other) 成为参数,因此 5 * v 完全等同于 v * 5

关于ruby 运算符重载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1854203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com