在一个Array子类中(只是一个执行某些输入值强制的数组)我已经定义#concat
以确保强制值。由于没有人使用#concat
并且更有可能使用#+=
我尝试将#+=
别名为#concat
,但似乎永远不会被调用。有什么想法吗?
请注意,强制实际上总是对特定超类的对象(通过构造函数接受输入),以防这个代码看起来不像我描述的那样。它是内部私有API的一部分。
class CoercedArray < Array
def initialize(type)
super()
@type = type
end
def push(object)
object = @type.new(object) unless object.kind_of?(@type)
super
end
def <<(object)
push(object)
end
def concat(other)
raise ArgumentError, "Cannot append #{other.class} to #{self.class}<#{@type}>" unless other.kind_of?(Array)
super(other.inject(CoercedArray.new(@type)) { |ary, v| ary.push(v) })
end
alias :"+=" :concat
end
#concat
工作正常,但#+=
似乎完全被旁路。
答案 0 :(得分:5)
由于a += b
是a = a + b
的语法糖,我试图覆盖+
方法。