我有一个类,可以调用不同的供应商,以查找是否可用。如何执行每个常数返回的类?
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
您的问题是您没有制作包含常数值的数组;您正在用字符串" adapter_one"one_answers" 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
是的,您有一系列的字符串而不是常数,但是如果您想在使用字符串的课程中走那条路,如果您查看http://blog.sidu,那将是不错的。