我在模型的初始化方法中有以下内容:
@home_phone = contact_hash.fetch('HomePhone')
然而,有时候我需要这个:
@home_phone = contact_hash.fetch('number')
此外,有时这些都不是真的,我需要home_phone
属性为空。
如何在不创建像这样的大循环的情况下写出来:
if contact_hash.has_key?('HomePhone')
@home_phone = contact_hash.fetch('HomePhone')
elsif contact_hash.has_key?('number')
@home_phone = contact_hash.fetch('number')
else
@home_phone = ""
end
答案 0 :(得分:7)
你可以尝试
@home_phone = contact_hash.fetch('HomePhone', contact_hash.fetch('number', ""))
或更好
@home_phone = contact_hash['HomePhone'] || contact_hash['number'] || ""
答案 1 :(得分:3)
contact_hash.values_at('HomePhone','number','home_phone').compact.first
编辑:
我的第一个解决方案并没有真正给出答案。这是一个修改版本,虽然我认为只有3个选项,@ knut给出的解决方案更好。
contact_hash.values_at('HomePhone','number').push('').compact.first
答案 2 :(得分:0)
我猜你可以使用values_at
:
@home_phone = contact_hash.values_at('HomePhone', 'number').find(&:present?).to_s
这不是很短,但如果你有一个数组中的键是不方便的:
try_these = %w[HomePhone number]
@home_phone = contact_hash.values_at(*try_these).find(&:present?).to_s
您也可以将其包含在某个实用程序方法中,或者将其修补到Hash
。
答案 3 :(得分:0)
def doit(h, *args)
args.each {|a| return h[a] if h[a]}
""
end
contact_hash = {'Almost HomePhone'=>1, 'number'=>7}
doit(contact_hash, 'HomePhone', 'number') # => 7