重构这种情况的任何提示?
params = {:p1=>"foo", :p2=>true, :p3=>nil, :pN=>""}
if params[:p1].present? && params[:p2].present? && params[:pN].present?
# do something...
答案 0 :(得分:3)
这样的事情:
params.values_at(:p1, :p2, :pN).all?(&:present?)
答案 1 :(得分:1)
if params.values_at(*%i[p1 p2 p3]).all?(&:present?)
values_at
会为您提供的每个密钥返回Array
个值。
如果可枚举的每个成员的谓词(all?
)为true
,则present?
为true
。 values_at
将包含nil
以查找缺失的密钥(而不是省略它),因此您无需担心数组会折叠为仅显示值。
答案 2 :(得分:1)
keys = [:p1, :p2, :pN]
puts "hi" if keys.all? { |k| params[k].present? }
这样做的好处是,只要params[k].present?
为false
,就会终止哈希查找。