什么是“ nil”条件的Ruby优雅方式?

时间:2018-11-14 10:10:44

标签: ruby hash block

是否有更优雅的方式编写此代码?

    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?

有表达它的简便方法吗?

4 个答案:

答案 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 || {}

因此,如果要分配的valuenil,则该键的值将变为{}