1

我想从 post 参数中迭代一个键值对数组:

Parameters:
  {"utf8"=>"✓",
  "authenticity_token"=>"c6VYssp33I075nfv1ViPty38+aZSkWM/jh6oll2pYS8=", 
  "permission"=>
    {"employment_id"=>"7", 
     "organisation_level"=>"all_below", 
     "permissions"=>"view_permissions", 
     "users"=>"", 
     "organisation"=>"", 
     "functions"=>"", 
     "statistics"=>""}, 
  "commit"=>"Opslaan"} 

我从这些参数中取出权限映射并尝试处理它。基本上我想检查键是否不是employment_id 并且值是否存在

params.each do |k,v|
  if(!(k.eql?"employment_id") && v.present?)
   p v
  end

end

在为每个运行 if 语句时,我遇到了一些奇怪的行为,我想知道是否有人可以对这种情况有所了解

我最终得到了这个 if 语句,它像我期望的那样工作和评估。它仅在值不是""nil并且键不是时打印值employment_id

if(!(k.eql?"employment_id") && v.present?)
  p v
end 

但是,以下 2 个 if 语句无法按我的预期工作。两者都打印所有值。他们评估,true而我认为他们不应该。

if(!k.eql?"employment_id" && v.present?)
  p v 
end 

if !k.eql?"employment_id" && v.present?
  p v 
end 
4

1 回答 1

5

造成您困惑的原因是操作的优先级,尤其是在您省略括号的情况下。在您的情况下,这些语句的评估如下:

if(!k.eql?"employment_id" && v.present?)
# equivalent to 
if (!(k.eql?("employment_id" && v.present?)))

if !k.eql?"employment_id" && v.present?
# equivalent to 
if !k.eql?("employment_id" && v.present?)

在这里,"employment_id" && v.present?评估为true。所以本质上,你问的是!k.eql?(true)哪个,k作为一个字符串总是评估为true(因为否定)。

为了规避这个问题,请确保正确使用括号。最好您应该将它们用于这样的方法调用

k.eql?("employment_id")

而不是喜欢

(k.eql? "employment_id")

这样,您就可以清楚地说明方法参数是什么,并避免歧义,然后需要优先解决这些歧义。如果参数真的很清楚,我个人倾向于只省略方法括号。尤其是在像你这样的更复杂的陈述中,省略它们并因此降低清晰度是没有多大意义的。

于 2012-05-08T08:11:10.493 回答