Ruby 如果散列有键,则使用它。否则,请使用不同的键

Ruby 如果散列有键,则使用它。否则,请使用不同的键,ruby,dictionary,Ruby,Dictionary,response是一个看起来像两件事之一的散列: response = {'demo' => 'nil', 'test_01' => 'Demo Data'} 或 我想这样做: if response.has_key? 'test_01' new_response.update(:nps_score => response['test_01'] else new_response.update(:nps_score => response['test

response
是一个看起来像两件事之一的散列:

response = {'demo' => 'nil', 'test_01' => 'Demo Data'}

我想这样做:

if response.has_key? 'test_01'
    new_response.update(:nps_score  => response['test_01']
else
    new_response.update(:nps_score  => response['test']
end
有没有更“红宝石”的方法?也许是使用| |运算符的东西?我正在使用ruby 2.0.0和rails 4.0.0

new_response.update(:nps_score => response['test_01'] || response['test'])
除非
false
nil
是您可能期望的有效值,否则这将起作用。如果是这样的话,你可以用三元数

new_response.update(:nps_score => response.has_key?('test_01') ? response['test_01'] : response['test'])
这就是Hash方法的用途

new_response.update(nps_score: response.fetch('test_01', response['test']))

另一种方法是在构建时将行为嵌入哈希中

response = Hash.new do |h, key|
  h['test'] if key == 'test_01'
end.update( 'test' => 'Demo Data', 'demo' => 'nil' )

response['test_01']
#=> 'Demo Data'

这更准确+1使用块形式避免在可能不需要时获取值。@MatheusMoreira:这是一个很好的观点。对于任何想知道权衡的人来说,块形式有更好的最佳情况时间,但稍微差一点的最坏情况时间。不过,我主要是为了可读性而这样写的。Luigi,如果我照字面理解你所说的,
response.size=>1
response
,唯一的键是
'test\u 01'
'test'
,它的单个值不依赖于键,那么
new\u response.update(:nps\u score=>response.values.first)
就是你所需要的。我误解你的问题了吗?你的意思是说,
'test\u 01'=>'演示数据1
'test\u 01'=>'演示数据2
@CarySwoveland谢谢你的帮助-你是对的,但我编辑了我的问题来说明我真正需要什么。哈希键/值可能并不总是第一对。
response = Hash.new do |h, key|
  h['test'] if key == 'test_01'
end.update( 'test' => 'Demo Data', 'demo' => 'nil' )

response['test_01']
#=> 'Demo Data'