今朝、Rubyで三項演算子に関して、奇妙なことが起こりました。ここにそれがどうなるか:
x = nil ? x : true
すべての人に知られているように、truex
に設定されていますが、驚くことではありません。さて、続いて実行します:
defined?(y)
=> nil
この答えは、y
まだ定義されていないことを意味します。でも:
defined?(y) ? y : true
trueを返します。二度と驚きはありません。驚きはここにあります:
y = defined?(y) ? y : true
そして何が起こりますか?y
に設定されていnil
ます!
しかし、待ってください、もっとあります。が割り当てられたのでy
、次を使用して作業しましょうz
:
defined?(z)
#=> nil
暗示z
はまだ定義されていません。
z = defined?(z) ? false : true
そして、サプライズ:はfalsez
に設定されています。私はそれがどのように起こるのか分かりません。ブロックで同じことを行うと、同じ結果が得られます。if
z1 = if defined?(z1) then z1 else true end
再びz1
に設定されnil
ます。
z2 = if defined?(z2) then false else true end
z2
これも、に設定されているように、私に驚きを与えますfalse
。今、私は上記の式が次のように動作すると仮定していました:
z3 = if nil then false else true end
上記のすべての場合に戻ったという事実を考慮して、z3
はに割り当てられます。これにより、呼び出しを回避するために何か特別なことがあると思いますが、Rubyのドキュメントにはそれに関する情報が見つかりませんでした。true
defined?
nil
defined?
ところで。上記をルビー1.8.7と1.9.2でテストしました