好吧,看起来你有一个开放的报价,它在其他地方被关闭,后来在路上,在另一条线上。
有趣的事实:
ruby_hash = {}
ruby_hash['class Atom
def initialize
end
end'] = 0
作品。因为它只是一个字符串键。因此,您只是将一个巨大的长字符串评估为“参数”哈希的键,该哈希肯定会评估为nil,因为它不是哈希中的现有键。
编辑!您编辑了问题并提供了更多信息。让我们分解一下。
params = {"a"=>3, "id2"=>"2", "b"=>2, "id"=>"1", :id=>"2"}
# Simple enough, nothing strange here.
if params['a'] < 0 || params['a'] > params['b' || params[:b] < 1]
puts 'strange...'
end
The plot thickens, or does it?
如果!
params['a'] < 0
这当然意味着:如果 params 中“a”的值小于 0
||
...这意味着“或”
params['a'] >
停在这里一秒钟 - 如果 'a' 的值大于....
params['b' || params[:b] < 1]
等等,什么?让我们更深入地了解一下。
params[ => We look inside the hash
'b' || params[:b] < 1 ## HERE IS THE 'MAGIC' => 'b' || params[:b] < 1
] # end of the key
所以神奇的是:我们想要 OR 语句的结果:
- 字符串'b'
- 'params[:b] < 1 的评估
那么到底发生了什么?好吧,事实上,因为 'b' 不是假的,它只会返回 params['b'] 的值,所以这就是你的 if 语句的真正含义:
if params['a'] < 0 || params['a'] > params['b']
如果'b'由于某种原因被评估为假,你最终会得到“params [params [b:] < 1]”,在你的情况下它是假的,然后意味着“params [假]。
这有意义吗?