我想对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
,而我认为他们不应该。{/ p>
if(!k.eql?"employment_id" && v.present?)
p v
end
和
if !k.eql?"employment_id" && v.present?
p v
end
答案 0 :(得分: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")
这样,您可以清楚地了解方法参数是什么,并避免出现需要通过优先级解决的歧义。如果真的很清楚参数是什么,我个人倾向于只省略方法括号。特别是在像你这样的更复杂的陈述中,省略它们并因此降低清晰度是没有多大意义的。