-1

私は誤って次のチェックを作成しました、それはうまくいきます、しかし私はなぜか興味があります:)

  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
4

1 に答える 1

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

つまり、もちろん、パラメータの「a」の値が0未満の場合

|| 

...それは'または'を意味します

params['a'] >

ここで1秒間停止します-「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'はfalseではないため、params ['b']の値を返すだけなので、これが実際のifステートメントです。

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

'b'が何らかの理由でfalseと評価された場合、「params [params [b:] <1]」になります。これは、この場合はfalseになり、「params[false]」を意味します。

これは意味がありますか?

于 2012-04-30T20:59:05.400 に答える