我正在尝试使用可链接的方法创建一个类似Array的类,但我似乎被搞砸了,因为Ruby的Array方法调用:: Array.new而不是self.class.new:
volatile
我知道我可以通过并重新实现所有调用其构造函数的Array方法,但这看起来真的很虚伪。
有趣的是,Set DOES'正确'工作:
class MyArray < Array; end
x = MyArray.new
y = MyArray.new
(x+y).class # Array, expected MyArray!
我错过了什么?是否有以这种方式对Array进行子类化的Ruby习惯用法?谢谢!
答案 0 :(得分:2)
+
和Array
之间Set
方法的基础实现有所不同。我们可以阅读源代码以找到根本原因:
对于Array
,它使用一个新变量来存储生成的数组:
rb_ary_plus(VALUE x, VALUE y)
{
VALUE z;
long len, xlen, ylen;
......
return z;
}
但对于Set
,+
是别名:|
;它使用dup
生成原始Set
对象的浅表副本,它不会生成新的Set
对象来存储结果。
def |(enum)
dup.merge(enum)
end
答案 1 :(得分:0)