今朝、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のドキュメントにはそれに関する情報が見つかりませんでした。truedefined?nildefined?
ところで。上記をルビー1.8.7と1.9.2でテストしました