gpt4 book ai didi

ruby - 从数组强制

转载 作者:数据小太阳 更新时间:2023-10-29 08:40:34 27 4
gpt4 key购买 nike

假设我有这个简单的类:

class Color
attr_accessor :rgb
def initialize(ary)
@rgb = ary
end
def +(other)
other = Color.new(other) unless Color === other
Color.new(@rgb.zip(other.rgb).map {|p| [p.reduce(:+), 255].min })
end
end

我知道这是一种糟糕的实现方式,但这是我能想到的最短的方式。

c100 = Color.new([100, 100, 100])
c100 + c100 #=> Color(200, 200, 200)
c100 + c100 + c100 #=> Color(255, 255, 255)

如果我给一个数组作为颜色,它也可以工作:

c100 + [50, 50, 50] #=> Color(150, 150, 150)

但我不能这样做:

[50, 50, 50] + c100 #=> TypeError: can't convert Color into Array

定义 coerce 不起作用。我怎样才能让它发挥作用?

最佳答案

是因为代码

[50, 50, 50] + c100

调用 Array 上的 + 方法,而不是 Color,并且该方法不能将颜色转换为 Array。

相比之下,

 c100 + [50, 50, 50]

调用 Color 的 + 方法。

但是,即使你在Color中定义了一个转换方法:

class Color
def to_ary
return @rgb
end
end

Array 方法不会像您预期的那样工作;结果将是两个数组的连接,因为 Array 的 + 方法连接它们的操作数,而不是添加它们的元素:

irb>[50,50,50]+c100
=> [50,50,50,100,100,100]

在这里,结果将是一个数组,而不是一个颜色。

编辑:

我认为使这项工作可行的唯一方法是为 Array 的 + 方法设置别名,以处理接收 Color 作为第二个操作数的特殊情况。但是,我承认这种方法相当丑陋。

class Array
alias color_plus +
def +(b)
if b.is_a?(Color)
return b+self
end
return color_plus(b)
end
end

关于ruby - 从数组强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7549181/

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