我有一个课程,呼叫不同的供应商,以查找项目是否可用。如何执行每个常量返回的类?
class ItemProvider
ADAPTER_ONE = Providers::ItemFromSupplierOne
ADAPTER_TWO = Providers::ItemFromSupplierTwo
def get_item(item)
id = ItemDetail.new(item)
%w(ADAPTER_ONE ADAPTER_TWO).each do |provider|
item_detail = provider.new(id)
break if item_detail.valid?
end
item_detail
end
答案 0 :(得分:2)
你的问题是你没有制作一个包含常数值的数组;你正在使用字符串“ADAPTER_ONE”和“ADAPTER_TWO”创建一个数组。 %w()
语法总是生成一个字符串数组 - 它不解析变量名。
您想要的是将get_item
代码更改为以下内容:
def get_item(item)
id = ItemDetail.new(item)
[ADAPTER_ONE, ADAPTER_TWO].each do |provider|
item_detail = provider.new(id)
break item_detail if item_detail.valid?
end or nil # break automatically makes the block return the value you break with
end
顺便说一下,我个人认为我会像这样重写它:
def get_item(item)
id = ItemDetail.new(item)
[ADAPTER_ONE, ADAPTER_TWO].map {|provider| provider.new(id) }.find &:valid?
end
答案 1 :(得分:1)
是的,你有一个字符串数组而不是常量但是如果你想在字符串中使用类很好,那么看看http://blog.sidu.in/2008/02/loading-classes-from-strings-in-ruby.html#.UuGdmGQ1i2w会很好。也许它与你的问题没有直接关系但这是一个很好的阅读。