gpt4 book ai didi

ruby - 如何在 Ruby 中实现查找类?

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

我有一个不可变值对象列表。查找类提供了迭代和查询该数据的方法:

class Banker
Bank = Struct.new(:name, :bic, :codes)

attr_reader :banks
def initialize
@banks = [
Bank.new('Citibank', '1234567', ['1', '2']),
Bank.new('Wells Fargo', '7654321', ['4']), # etc.
]
end

def find_by_bic(bic)
banks.each do |bank|
return bank if bank.bic == bic
end
end
end
每次使用 Banker 时,

@banks 都会被初始化。有哪些选项可以缓存 @banks,以便在 Banker 的不同实例中重复使用它?

最佳答案

我不认为 Struct 在这里能给您带来任何好处。这样做怎么样?

代码

class Banker
@all_banks = {}

class << self
attr_reader :all_banks
end

attr_reader :banks

def initialize(banks)
@banks = banks.keys
banks.each { |k,v| self.class.all_banks[k] = v }
end

def find_by_bic(bic)
return nil unless @banks.include?(bic)
self.class.all_banks[bic]
end
end

注意self.class中的self需要区分self的类和关键字class

示例

b1 = Banker.new({ '1234567' => { name: 'Citibank', codes: ["1", "2"] },
'7654321' => { name: 'Wells Fargo', codes: ['4'] } })
b1.banks
#=> ["1234567", "7654321"]
Banker.all_banks
#=> {"1234567"=>{:name=>"Citibank", :codes=>["1", "2"]},
# "7654321"=>{:name=>"Wells Fargo", :codes=>["4"]}}
b1.find_by_bic '7654321'
#=> {:name=>"Wells Fargo", :codes=>["4"]}
b1.find_by_bic '1234567'
#=> {:name=>"Citibank", :codes=>["1", "2"]}
b1.find_by_bic '0000000'
#=> nil

b2 = Banker.new({ '6523155' => { name: 'Bank of America', codes: ["3"] },
'1234567' => { name: 'Citibank', codes: ["1", "2"] } })
b2.banks
#=> ["6523155", "1234567"]
Banker.all_banks
#=> {"1234567"=>{:name=>"Citibank", :codes=>["1", "2"]},
# "7654321"=>{:name=>"Wells Fargo", :codes=>["4"]},
# "6523155"=>{:name=>"Bank of America", :codes=>["3"]}}
b2.find_by_bic '6523155'
#=> {:name=>"Bank of America", :codes=>["3"]}
b2.find_by_bic '1234567'
#=> {:name=>"Citibank", :codes=>["1", "2"]}
b2.find_by_bic '7654321'
#=> nil

备选方案

如果您愿意,您可以改为添加类方法:

def self.new(banks)
banks.each { |k,v| all_banks[k] = v }
super
end

并删除initialize中的第一行。

或者,如果您有所有银行的完整列表,您可以将 all_banks 设为常量:

ALL_BANKS = {"1234567"=>{:name=>"Citibank", :codes=>["1", "2"]},
"7654321"=>{:name=>"Wells Fargo", :codes=>["4"]},
"6523155"=>{:name=>"Bank of America", :codes=>["3"]}}

def find_by_bic(bic)
return nil unless @banks.include?(bic)
ALL_BANKS[bic]
end

并将initialize更改为:

def initialize(bics)
@banks = bics
end

其中 bicsbic 值的数组。

关于ruby - 如何在 Ruby 中实现查找类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26324685/

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