1

今朝、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でテストしました

4

1 に答える 1

0

Ok。私はこれがそれを説明すると思います:

ccc = (ccc == nil)
=> true

どうやら、変数に何かを割り当てるときはいつでも、rubyは最初にそれをnilに初期化します。

于 2012-11-09T07:50:48.543 に答える