2

三項演算子を使用した割り当てが奇妙に反応するのはなぜだろうと思っています。

a = "foo"­
=> "foo"
a = nil ? nil : a
=> "foo"
a
=> "foo"

しかし:

a = nil ? nil : a
=> "foo"
a = "bar"­ ? "bar"­ : a
=> "bar"
a
=> "bar"

と:

if a = nil
  puts "should be nil"
end
=> nil

代入は成功しましたが、 は falseを返すputsため、文字列は返されません。a = nilnil

それはすべて意図したとおりに動作していますか?

4

5 に答える 5

7
if a = nil

これは false を返すのではなく、割り当てられたものを返します。この場合は でしたnilnilは「偽り」なので、puts

理由について:

a = "foo"­
=> "foo"
a = nil ? nil : a
=> "foo"
a
=> "foo"

aそれはあなたが再び割り当てているからです。nil ? nil : a返さaれるので、それが割り当てられます。a = nil ? nil: aのように解釈されてしまいますa = a

于 2013-07-02T00:04:26.933 に答える
5

私はこれを信じています:

if a = nil

次のようにする必要があります。

if a == nil

single=は代入を意味し、結果としてa = nil代入と評価を行いますが、これは false です。そのため、実行は部分に入らず、同等性テストを意味します。nilanilputs==

それ以外に、コードのどこがおかしいと思いますか? 結局のところ、それは正常な動作です。

于 2013-07-02T00:02:37.613 に答える
2

割り当てを行うつもりで、それが比較ではないことを知っていたと仮定するとa = nil、それが成功したかどうかは返されません。

割り当てられた値、つまり を返しますnil

于 2013-07-02T00:04:37.413 に答える
1
a = "foo"­
# => "foo"
a = nil ? nil : a
# => "foo"
a
# => "foo"

上記を説明するために、「Ruby のすべてのものは、ブロックを除いてオブジェクトです。Ruby のすべてのオブジェクトは、 と を除いて、真の値を持っていますnilfalse」したがって、上記のコードa = nil ? nil : a式の部分では、 として評価されa = aます。だから 'foo' has been returned as a value ofa`.

a = "bar"­ ? "bar"­ : a
# => "bar"
a
# => "bar"

先ほど言ったようにnilfalseすべてのオブジェクトには真の値があり、"バー" は常にtrueです。したがって、式a = "bar"­ ? "bar"­ : aは として評価されa = "bar"ます。

if a = nil
  puts "should be nil"
end
=> nil

上で説明したのと同じ説明がそのif a = nil部分に行きます。そのため、falseコントロールが句本体に入らずif、返されnilます。

于 2013-07-02T03:47:39.457 に答える
1

あなたが提供した例は、意図したとおりに動作しています。

代入演算子=と比較演算子を混同している可能性があります==。次のように、最後に切り取ったコードを試してください。

if a == nil
  puts "should be nil"
end
=> nil
> a
=> "bar"
于 2013-07-02T00:02:51.670 に答える