【问题标题】:ruby - strange param behaviorruby - 奇怪的参数行为
【发布时间】:2012-05-01 08:59:28
【问题描述】:

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

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

如果在['b 之后没有关闭,为什么会这样。

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

更新:

这是 ruby​​ 的输出:

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

【问题讨论】:

  • 您是否尝试过编写一个包含上述行的简单 ruby​​ 文件?
  • 呃,那段代码肯定不行。你确定这就是你所拥有的吗?也许您稍后有一个匹配的'
  • 你是对的,粘贴时出了点问题,这是我使用的原始代码('b 后缺少'): if params['a'] 参数['b' ||参数[:b]
  • @adiel-mittmann 是的,我试过了:params &gt; =&gt; {"a"=&gt;3, "id2"=&gt;"2", "b"=&gt;2, "id"=&gt;"1", :id=&gt;"2"} &gt; if params['a'] &lt; 0 || params['a'] &gt; params['b' || params[:b] &lt; 1] &gt; puts 'strange...' &gt; end &gt; strange... &gt; =&gt; nil

标签: ruby sinatra


【解决方案1】:

嗯,看起来你有一个开放式报价,它在其他地方被关闭,后来在路上,在其他线路上。

有趣的事实:

ruby_hash = {}
ruby_hash['class Atom
def initialize
end
end'] = 0

有效。因为它只是一个字符串键。所以你只是在评估一个巨大的长字符串作为'params'哈希的键,它肯定会评估为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] 的评估

那么到底发生了什么?好吧,事实上,因为 'b' 不是假的,它只会返回 params['b'] 的值,所以这就是你的 if 语句的真正含义:

if params['a'] < 0 || params['a'] > params['b']

如果 'b' 由于某种原因被评估为假,你最终会得到“params[params[b:]

这有意义吗?

【讨论】:

  • 正好在整行末尾结束,我也粘贴了。很抱歉有一个错字,现在我将再次粘贴整行,因为它没有正确粘贴。有 ' 关闭 'b: if params['a'] &lt; 0 || params['a'] &gt; params['b' || params[:b] &lt; 1] 那么为什么这样有效?
  • 编辑了我的答案以提供更深入的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多