-1

我不小心创建了以下检查,效果很好,但我很好奇为什么:)

  1. 首先,我知道我可以分配:a而不是 'a' ;)
  2. 我知道这个检查的正确公式,我只是好奇为什么会这样
  3. 我不在乎优化这个(阅读2)
if params['a'] < 0 || params['a'] > params['b || params[:b] < 1]

为什么这行得通,如果['b.

除此之外,一切正常,直到我删除 last]或将其更改为其他内容。

更新:

这是红宝石的输出:

irb> params

 => {"a"=>3, "id2"=>"2", "b"=>2, "id"=>"1", :id=>"2"}

irb> if params['a'] < 0 || params['a'] > params['b' || params[:b] < 1]
irb>   puts 'strange...'
irb> end

strange...

=> nil
4

1 回答 1

1

好吧,看起来你有一个开放的报价,它在其他地方被关闭,后来在路上,在另一条线上。

有趣的事实:

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 [假]。

这有意义吗?

于 2012-04-30T20:59:05.400 回答