不将nil值分配给散列

Red*_*Red 17 ruby hash null ruby-on-rails ruby-1.9

当ruby中的nil为零时,是否存在将事物分配给哈希的简短手或最佳实践?例如,我的问题是我正在使用另一个哈希来构建它,如果其中的某些内容是nil,它会为该键分配nil,而不是仅仅将其保留.我理解为什么会这样,所以我的解决方案是:

hash1[:key] = hash2[:key] unless hash2[:key].nil?
Run Code Online (Sandbox Code Playgroud)

因为我不能在键中实际指向nil的值中有值.(我宁愿有一个空哈希比一个有{:key => nil}的哈希,这是不可能的)

我的问题是有更好的方法吗?我不想在作业结束时执行delete_if.

Til*_*ilo 20

如果你否定"除非"陈述,会稍微缩短一点

hash1[:key] = hash2[:key] if hash2[:key]   # same as   if ! hash2[:key].nil?
Run Code Online (Sandbox Code Playgroud)

您也可以在迈克尔或马克 - 安德烈的其他答案中建议的&&声明中进行比较

这真的取决于你,你觉得最可读的东西.通过设计,Ruby总有多种方法来解决问题.

你也可以修改hash2:

hash1 = hash2.reject{|k,v| v.nil?}

hash2.reject!{|k,v| v.nil?}   # even shorter, if in-place editing of hash2
Run Code Online (Sandbox Code Playgroud)

这将删除键/值对:key => nil from hash2(就地,如果你使用拒绝!)


bke*_*ner 5

我最喜欢这个,循环和条件覆盖都在一行!

h1 = {:foo => 'foo', :bar => 'bar'}
h2 = {:foo => 'oof', :bar => nil}

h1.merge!(h2) { |key, old_val, new_val| new_val.nil? ? old_val : new_val }

#=> {:foo => 'oof', :bar => 'bar'}
Run Code Online (Sandbox Code Playgroud)

这会将 h1 中的每个值替换为 h2 的值,其中键相同且 h2 值不为 nil。