是否有更优雅的方式编写此代码?
def create_a_hash_from_a_collection
my_hash = {}
collection_of_hashes.each do |key, value|
my_hash[key] = {} if my_hash[key].nil?
my_hash[key] = value
end
my_hash
end
在我看来笨拙的一行是这样的:
my_hash[key] = {} if my_hash[key].nil?
有表达它的简便方法吗?
答案 0 :(得分:2)
如果您想为初始哈希中的每个键都使用一个全新的哈希,则需要使用一个块将其初始化:
hash = Hash.new { |hash, key| hash[key] = {} }
hash[:foo].object_id == hash[:bar].object_id #=> false
否则,如果这样做,它将始终是相同的默认哈希值
hash = Hash.new({})
hash[:foo].object_id == hash[:bar].object_id #=> true
答案 1 :(得分:1)
我想您想要的是使用默认值初始化$users = import-csv "C:\Users\Bruger\Dokumenter\Esport_liste.csv" -Header "User"
$i = 0
$team = 1
$users | Sort-Object { Get-Random } | foreach {
if(($i % 3) -eq 0){ " "; "Team $($team)"; $team++ }
$_.User
$i++
}
,因此您无需检查它是否为零。
可以使用my_hash
构造函数进行比较:
Hash.new
然后您可以将代码简化为:
my_hash = {}
puts my_hash['no_existing_key'] #=> nil
my_hash = Hash.new({})
puts my_hash['no_existing_key'] #=> {}
答案 2 :(得分:1)
您可以使用||=
运算符来完成您想要的操作
my_hash[key] ||= {}
我在这里剩下的答案是,因为我不确定什么是“哈希集合”,所以我最好的猜测是它将是一系列哈希。如果我错了,请让我知道,而无视此答案的其余部分。
看来您方法的其余部分可能并没有听起来像您尝试做的那样。考虑:
@collection_of_hashes = [{foo: 'bar'}, {baz: 'qux'}]
def create_a_hash_from_a_collection
my_hash = {}
@collection_of_hashes.each do |key, value|
# this is not actually doing anything here and returns same with or
# without the following line
# my_hash[key] ||= {}
my_hash[key] = value
end
my_hash
end
#=> {{:foo=>"bar"}=>nil, {:baz=>"qux"}=>nil}
但是您可能想要的是
def create_a_hash_from_a_collection
my_hash = {}
@collection_of_hashes.each do |hash|
hash.keys.each do |k|
my_hash[k] = hash[k]
end
end
my_hash
end
#=> {:foo=>"bar", :baz=>"qux"}
但是还要记住,如果您倾向于将您的任何“哈希集合”包含为一组哈希,并且包含相同的密钥,那么哪个会赢?此代码将是数组键值中的最后一项。您的方法的实际目标是什么?
答案 3 :(得分:0)
由于您仍在分配值,因此也许可以使用my_hash[key] = value || {}
?
因此,如果要分配的value
是nil
,则该键的值将变为{}
。