gpt4 book ai didi

ruby - 如何重写 Ruby 中的数组构造函数?

转载 作者:数据小太阳 更新时间:2023-10-29 07:33:33 26 4
gpt4 key购买 nike

我有以下类(class):

class Library < Array
attr_accessor :authors
end

我想在类的构造函数中初始化 authors 属性,并且仍然使用 Array#new 行为。我试过这个:

class Library < Array
attr_accessor :authors

def initialize(**args)
@authors = {key1: 'val1', key2: 'val2'}
super(args)
end

end

但这会产生错误。

我怎样才能做到这一点?

最佳答案

因此 #initialize 覆盖失败​​,因为您使用的是对象 splat (**) 而不是数组 splat (*)。

但是你不应该这样做。对 Ruby 的核心类进行子类化会导致各种违反直觉的行为,因为它们有许多创建该类的新实例的方法——这些方法不会被更新以创建您的类的新实例。例如,Library.new.reverseLibrary.new + Library.new 都将返回新数组,而不是库。

相反,您可以通过在您的类中创建一个数组实例变量并委托(delegate)给它来获得您想要的行为。您可以定义 #each 并获取所有 Ruby enumerable方法。您还可以定义任何您想要的数组方法。

class Library
include Enumerable
attr_accessor :authors

def initialize(*args)
@authors = {key1: 'val1', key2: 'val2'}
@array = args
end

def each(&block)
@array.each(&block)
end

def [](index)
@array[index]
end
end

关于ruby - 如何重写 Ruby 中的数组构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39691790/

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