创建:: Array的可链接子类?

时间:2015-09-28 01:20:12

标签: arrays ruby inheritance

我正在尝试使用可链接的方法创建一个类似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习惯用法?谢谢!

2 个答案:

答案 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)

是的,对于像stdlib这样的东西,事情是一种不一致的实现,我也找到了。对不起,我认为没有任何简单的魔术答案。没有真正的红宝石成语,红宝石并不真的希望你这样做,有些人已经发布了主张从不对Array或Hash进行子类化的提倡。 http://words.steveklabnik.com/beware-subclassing-ruby-core-classes