gpt4 book ai didi

ruby - 在 Ruby 中使用委托(delegate)维护相同的类

转载 作者:行者123 更新时间:2023-12-05 00:42:57 26 4
gpt4 key购买 nike

我试图围绕委托(delegate)与继承展开讨论,因此我手动委托(delegate)了一个 Array 版本。我读到这样做的具体原因之一是因为当您使用诸如枚举之类的东西时,您在继承方法上的返回值会恢复为父类(即数组)。所以我这样做了:

module PeepData
# A list of Peeps
class Peeps
include Enumerable

def initialize(list = [])
@list = list
end

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

def each(...)
@list.each(...)
end

def reverse
Peeps.new(@list.reverse)
end

def last
@list.last
end

def join(...)
@list.join(...)
end

def from_csv(csv_table)
@list = []
csv_table.each { |row| @list << Peep.new(row.to_h) }
end

def include(field, value)
Peeps.new(select { |row| row[field] == value })
end

def exclude(field, value)
Peeps.new(select { |row| row[field] != value })
end

def count_by_field(field)
result = {}
@list.each do |row|
result[row[field]] = result[row[field]].to_i + 1
end
result
end

protected

attr_reader :list
end
end

当我实例化它时,我的 include 和 exclude 函数很好,并返回一个 Peeps 类,但是当使用像 select 这样的枚举时,它返回 Array,这会阻止我在 select 之后链接更多 Peeps 特定方法。这正是我在学习委托(delegate)时试图避免的。

p = Peeps.new
p.from_csv(csv_generated_array_of_hashes)
p.select(&:certified?).class

返回数组

如果我覆盖 select,将其包装在 Peeps.new() 中,我会收到“SystemStackError:堆栈级别太深”。在 select 枚举期间,它似乎递归地将列表埋入列表的更深处。

def select(...)
Peeps.new(@list.select(...))
end

任何帮助,谢谢!

最佳答案

我建议同时使用 ForwardableEnumerable .使用 Forwardable 将 each 方法委托(delegate)给您的列表(以满足 Enumerable 接口(interface)要求),并转发任何 Array您可能希望包含不属于 Enumerable 模块的方法,例如 size。我还建议 not 覆盖 select 的行为,因为它应该返回一个数组并且至少会导致困惑。我会建议类似下面提供的 subset 来实现您正在寻找的行为。

require 'forwardable'

class Peeps
include Enumerable
extend Forwardable

def_delegators :@list, :each, :size

def initialize(list = [])
@list = list
end

def subset(&block)
selected = @list.select(&block)
Peeps.new(selected)
end

protected
attr_reader :list

end

示例用法:

peeps = Peeps.new([:a,:b,:c])
subset = peeps.subset {|s| s != :b}
puts subset.class
peeps.each do |peep|
puts peep
end
puts peeps.size
puts subset.size

产生:

Peeps
a
b
c
3
2

关于ruby - 在 Ruby 中使用委托(delegate)维护相同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71887836/

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