1

投稿パラメーターからキーと値のペアの配列を反復処理したい:

Parameters:
  {"utf8"=>"✓",
  "authenticity_token"=>"c6VYssp33I075nfv1ViPty38+aZSkWM/jh6oll2pYS8=", 
  "permission"=>
    {"employment_id"=>"7", 
     "organisation_level"=>"all_below", 
     "permissions"=>"view_permissions", 
     "users"=>"", 
     "organisation"=>"", 
     "functions"=>"", 
     "statistics"=>""}, 
  "commit"=>"Opslaan"} 

これらのパラメーターからパーミッション マップを取得し、処理を試みます。基本的に、キーが employee_id ではなく、値が present かどうかを確認したい。

params.each do |k,v|
  if(!(k.eql?"employment_id") && v.present?)
   p v
  end

end

この for each で if ステートメントを実行すると、奇妙な動作に遭遇しました。誰かがこの状況に光を当てることができるのではないかと思います

私はこの if ステートメントに行き着きました。期待どおりに機能し、評価されます。値がまたはでなく、キーがそうでない""場合にのみ値を出力しますnilemployment_id

if(!(k.eql?"employment_id") && v.present?)
  p v
end 

ただし、次の 2 つの if ステートメントは期待どおりに機能しません。どちらもすべての値を出力します。true彼らはそうすべきではないと思いますが、評価します。

if(!k.eql?"employment_id" && v.present?)
  p v 
end 

if !k.eql?"employment_id" && v.present?
  p v 
end 
4

1 に答える 1

5

混乱の原因は、特に括弧を省略した場合の操作の優先順位です。あなたの場合、ステートメントは次のように評価されます。

if(!k.eql?"employment_id" && v.present?)
# equivalent to 
if (!(k.eql?("employment_id" && v.present?)))

if !k.eql?"employment_id" && v.present?
# equivalent to 
if !k.eql?("employment_id" && v.present?)

そして、ここで、 に"employment_id" && v.present?評価されtrueます。したがって、本質的に、文字列であると常に評価されるものを尋ね!k.eql?(true)ています(否定のため)。ktrue

この問題を回避するには、括弧を適切に使用してください。できれば、そのようなメソッド呼び出しに使用する必要があります

k.eql?("employment_id")

の代わりに

(k.eql? "employment_id")

そうすれば、メソッドの引数が何であるかを明確にし、優先順位によって解決する必要があるあいまいさを回避できます。私は個人的に、引数が何であるかが本当に明確な場合にのみ、メソッドの括弧を省略する傾向があります. 特にあなたのようなより複雑なステートメントでは、それらを省略して明確性を低下させるのはあまり意味がありません.

于 2012-05-08T08:11:10.493 に答える