2

次のコードはエラーになります

例 1

if params[:id] == '2' || params.has_key? :id
  abort('params id = 2 or nothing')
end


syntax error, unexpected tSYMBEG, expecting keyword_then or ';' or '\n'
if params[:id] == '2' || params.has_key? :id

ただし、条件文を切り替える|| 括弧を追加すると 100% 機能します。

例 2

if params.has_key? :id || params[:id] == '2' 
  abort('params id = 2 or nothing')
end

例 3

if (params[:id] == '2') || (params.has_key? :id)
  abort('params id = 2 or nothing')
end

例 1 でエラーが発生する理由を説明できる人はいますか?

ありがとう

4

4 に答える 4

4

問題が発生している場所:

params[:id] == '2' || params.has_key? :id

これは次のように簡略化できます。

:foo || some_method :bar

同じエラーが発生します。この表現は原則として、あいまいです

(:foo || some_method) :bar         (1)

:foo || (some_method :bar)         (2)

式があいまいな場合は、他の要因によって解決されます。1 つの要因として、演算子の優先順位は、(1) と (2) の間のあいまいさを解消することについてここでは何も言いません。次の要素は線形順序です。||当該式では引数適用()(省略)より前に出てくるので、前者が後者より先に適用されます。したがって、式は (1) と解釈されます。は式として解析されるため(:foo || some_method)、2 つの式が隣り合って存在します。次のように、それは非文法的です。

:baz :bar

非文法的です。

実際、順序を次のように切り替えると:

some_method :bar || :foo

その後、次のように解釈されます

(some_method :bar) || :foo

同じ理由で、構文エラーは消えます。

また、括弧を明示的に使用して引数の適用を示すことであいまいさを解決する場合:

:foo || some_method(:bar)

あいまいさを解決する必要はなく、構文エラーは消えます。

于 2013-07-18T10:46:29.557 に答える
1

Your:idは Ruby の記号です。

a = {'id' => 'a', 'value' => 'value'}

a.has_key? 'id'
=> true

a.has_key? :id
=> false

したがって、コードを変更する必要があります。

if params[:id] == '2' or params.has_key? 'id'
  abort('params id = 2 or nothing')
end

注: このコードを使用する場合は、値をチェックする前にキーをチェックする方が理にかなっています。

注 #2: テスト済み:

params = {'id' => 'a', 'value' => 'value'}

if params[:id] == '2' or params.has_key? 'id'
  abort('params id = 2 or nothing')
end

および Ruby 2.0.0

Ruby シンボルの詳細については、この質問も確認してください。

于 2013-07-18T10:37:20.280 に答える
0

がそのステートメントをRuby評価する方法に関係しています。if

例1は次のようになります if (params[:id] == '2' || params.has_key?) :id

ご覧のとおり、予期しないシンボル エラーで解決されますsyntax error, unexpected tSYMBEG

于 2013-07-18T10:03:25.377 に答える
0

男が言うように...パーサーは、シンボルが has_key のパラメーターであると想定していませんか? 方法

括弧を明示的にコーディングすることで、エラーを回避できます

if params[:id] == '2' || params.has_key?(:id)
于 2013-07-18T10:15:44.727 に答える