我有一个名为data
的哈希,其密钥名为checks
,是一个日期数组。如果密钥存在,我想附加到现有数组。如果密钥不存在,我需要添加一个包含当前日期的数组。 在ruby中有优雅的方法吗?
这就是我现在正在做的事情,这似乎比它应该更难:
if data.has_key?('checks')
data['checks'] << DateTime.now
else
data['checks'] = Array.wrap(DateTime.now)
end
答案 0 :(得分:4)
通常我会像这样攻击它:
checks = data['checks'] ||= [ ]
checks << DateTime.now
如果您的data
哈希只有类似数组的值,请执行以下操作:
data = Hash.new { |h,k| h[k] = [ ] }
然后你不需要为||=
事情烦恼,因为任务会自动发生。
答案 1 :(得分:1)
我不确定它是否优雅,但你可以这样做:
data['checks'] = [*data['checks']] << DateTime.now
基本上,如果数据['checks']为nil
,则splat会将其缩减为[]
,但如果它有条目,则会缩减为具有相同条目的数组。
编辑这是其他人没有提及的另一种选择:
data['checks'] = (data['checks'] || []) << DateTime.now
EDIT2 不使用(可能令人困惑的)splat运算符:
data['checks'] = Array(data['checks']) << DateTime.now
答案 2 :(得分:1)
data['checks'] = data.fetch('checks', []) << DateTime.now
哈希#fetch获取一个键,如果缺少键,则返回一个值。也许比散布到数组文字中更优雅。
答案 3 :(得分:0)
if data.key?('checks')
data['checks'] << DateTime.now
else
data['checks'] = [DateTime.now]
end
答案 4 :(得分:0)
data['checks']= Array.wrap(data['checks']) << DateTime.now
但是想想更优雅的方式是这样的:
data['checks']= Array.wrap(data['checks']) + [DateTime.now]
Array.wrap
返回一个空白数组或现有数组。 Plus运算符将合并两个数组并将新数组分配给data['checks']
答案 5 :(得分:0)
if data[:checks]
data[:checks] << DateTime.now
else
data[:checks] = [DateTime.now]
end
一个班轮
data[:checks] ? data[:checks] << DateTime.now : data[:checks] = [DateTime.now]