清除分配值的方式,除非为空

时间:2010-06-03 21:25:52

标签: ruby

如果设置了源值,我经常需要分配一个变量。到目前为止,我这样做了:

filters[:red] = params[:search][:red] unless params[:search][:red].nil?

这有效,但看起来有点笨拙。必须有更干的方法来获得这个结果。

有什么建议吗?

祝你好运。 AsbjørnMorell。

4 个答案:

答案 0 :(得分:2)

如果你发现自己做了很多这样的事情,你可以写一个小帮手方法:

def set_unless_nil(hsh, key, val)
  hsh[key] = val unless val.nil?
end

然后:

set_unless_nil filters, :red, params[:search][:red]

如果源和目标哈希中的键经常是相同的,你可以写:

def copy_key_unless_nil(src_hash, key, dest_hash)
  dest_hash[key] = src_hash[key] unless src_hash[key].nil?
end

然后:

copy_key_unless_nil params[:search], :red, filters

或者您可以将值设置为Hash,然后在最后整理散列以删除所有具有nil值的键:

filters.delete_if { |k, v| v.nil? }

答案 1 :(得分:0)

它已经相当不错了,但它可能有点干......

red=params[:search][:red]
filters[:red]=red if red
它看起来有点整洁,并且仍然可以按你的意愿工作。永远记住你可以改写:

unless x.nil?

为:

if x

他们将评估相同,但后者稍微更模糊和更清洁

答案 2 :(得分:0)

如果params[:search][:red]只能为零,因为它不在哈希值中,我会使用params[:search].has_key?(:red),以便随意的读者可以了解情况会更好。

答案 3 :(得分:0)

如果params [:search] [:red]只能是nil,因为它不在散列中,并且假设你想要将params [:search]中的所有内容复制到过滤器,那么:

filters.merge!(params[:search])