2

私はこれを数回見ました:

if foo = bar
  # do something
end

これは構文的に適切ですか?とは違いますか?:

if foo == bar
   # do something
end
4

4 に答える 4

7
if foo = bar
end

これは次のように読むことができます:

foo = bar
if foo
  # do stuff
end

rubyの代入演算子は、割り当てられた値を返します。これは、ルビーが何が真実で何がそうでないかについて非常に単純なルールを持っているという事実のおかげで、いくつかの状況で非常に役立ちます。

これは、割り当てが条件で使用される典型的な例です(ただし、ファイルeach_lineとブロックを使用する必要があるため、適切ではありませんが、アイデアは得られます)。

f = File.open(...)
while line = f.gets
  # do something with a line from file
end

一方、これは比較演算子であり、代入演算子ではありません。foobarが等しい場合はブール値を返します。

if foo == bar

[編集]このパターンを使用すると、コードの冗長性に実際の影響を与える可能性があることを示す例。このネストされた条件式を見てください。

a = f(1)
result = if a
  b = g(a)
  if b
    c = h(b)
    if c
      2 * c
    end
  end
end

このパターンを使用して、代わりに書くことができます(割り当てをどのように囲むかに注意してください):

result = if (a = f(1)) && (b = g(a)) && (c = h(b))
  2 * c 
end
于 2013-01-28T17:48:48.873 に答える
3

それらは完全に異なります。bar1 つ目は の値を割り当て、fooその値が true (nilまたはでないfalse) かどうかを評価します。2 番目は単純な比較を行います。

于 2013-01-28T17:48:04.957 に答える
2

最初のものは、bar の値を foo に割り当てます。その後、foo の新しい値が true または false に向かって評価されます。

2 つ目は、foo と bar が同じかどうかをチェックします。

最初のもので foo の値を失います

于 2013-01-28T17:48:11.743 に答える
0

これは有効なコードですが、おそらく意図しないバグです。

一部の人々は自分のコードに夢中になり、同じ行で代入と if チェックの両方を実行しようとするかもしれませんが (最初の例のように)、よくあるタイプミスに非常に似ているため、「悪いコード」の 1 つとしてよく知られています。明確にするために避けるべき匂い」。

于 2013-01-28T17:47:12.850 に答える