"✓", "authenticity_token"=>"c6VYssp33I075nfv1ViPty38+-6ren">
gpt4 book ai didi

Ruby if 语句评估

转载 作者:太空宇宙 更新时间:2023-11-03 17:38:25 25 4
gpt4 key购买 nike

我想遍历来自 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

最佳答案

造成您混淆的原因是操作的优先级,尤其是在您省略括号的情况下。在您的情况下,语句的评估方式如下:

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")

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

关于Ruby if 语句评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com