私はこれを数回見ました:
if foo = bar
# do something
end
これは構文的に適切ですか?とは違いますか?:
if foo == bar
# do something
end
私はこれを数回見ました:
if foo = bar
# do something
end
これは構文的に適切ですか?とは違いますか?:
if foo == bar
# do something
end
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
一方、これは比較演算子であり、代入演算子ではありません。foo
とbar
が等しい場合はブール値を返します。
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
それらは完全に異なります。bar
1 つ目は の値を割り当て、foo
その値が true (nil
またはでないfalse
) かどうかを評価します。2 番目は単純な比較を行います。
最初のものは、bar の値を foo に割り当てます。その後、foo の新しい値が true または false に向かって評価されます。
2 つ目は、foo と bar が同じかどうかをチェックします。
最初のもので foo の値を失います
これは有効なコードですが、おそらく意図しないバグです。
一部の人々は自分のコードに夢中になり、同じ行で代入と if チェックの両方を実行しようとするかもしれませんが (最初の例のように)、よくあるタイプミスに非常に似ているため、「悪いコード」の 1 つとしてよく知られています。明確にするために避けるべき匂い」。