当对象可能为零时,如何尝试在Ruby中迭代Hash?

时间:2016-07-04 20:12:26

标签: ruby

我发现自己必须一直这样做,当我匆忙时,我将其包裹在一个条件中:

if !myhash.blank?
  hash.each do |k,v|
    do_something
  end
end

或:

myhash.map{|k,v| do_something} unless myhash.blank?

必须有更清洁的东西。

5 个答案:

答案 0 :(得分:7)

我倾向于使用to_h隐藏"是hash.to_h.each do |k,v| # something end "测试:

hash

如果hash.to_h已经是哈希,则hashhash.nil?,如果hash.to_h{ }array.to_a.each { |e| ... }

同样,我对数组使用to_a

nil

to_s表示字符串,to_i表示整数(当我想将{{1}}视为零时),...

答案 1 :(得分:5)

我可能会这样做:

(my_hash || {}).each do |k, v|
  # something
end

或者这个:

my_hash ||= {}
my_hash.each do |k, v|
  # something
end

答案 2 :(得分:3)

如果您使用的是rails,则可以说:

my_hash.try(:each) do |key, value|
  # code
end
如果接收方未对该方法做出响应,

try会在nil 时被调用nil

答案 3 :(得分:3)

如果你想特别迭代,如果不是nil你可以做类似的事情

hash && hash.each do |x|
  # do something
end

但我发现unless hash.nil?更具表现力。

答案 4 :(得分:0)

Hash(myhash).each {|k,v| # whatevs }

始终返回Hash。修改自:https://stackoverflow.com/a/18894072/1076207

irb test:

# $ irb
# irb(main):001:0> Hash(myhash=nil).each {|k,v|}
# => {}
# irb(main):002:0> Hash(myhash={"a" => "b"}).each {|k,v|}
# => {"a"=>"b"}