b=(defined? b)?b : "yeah!"
结果是啥...
a=a.....
a=a
虽然 = 是右结合的运算符,但 defined? 还是先看左边的
=
defined?
@jjym @luikore 你俩好给力...
这个问题的原因不是因为 Ruby 里变量出现过就是有定义的么,不一定要执行到。比如:
if false var = 1 end puts defined?(var) # => local-variable
还有一个例子是a = a || 1
a = a || 1
回到 a = a || 1。这里 Ruby 先看到了 a 出现在赋值符号的左手边,于是创建出变量 a,值为 nil;接下来对赋值符号右手边求值,nil || 1 的结果是 1;然后完成赋值,a 的值就是 1 了。单独的 a || 1 则没这待遇,得看前面有没有别的地方让 a 存在,不然就会出错。
http://rednaxelafx.iteye.com/blog/361770
@hooopo +1
不用真的执行赋值,只要Ruby解析器能看到某个名字出现在赋值符号的左边就够了,就会创建一个这个名字的变量,未赋值时值为nil。
ruby 在真的执行代码前好像是有个预处理的过程,这个过程已经认识到有 b 这个变量了。 在变量是否存在的判定上,都要注意这个:)
赞成上两楼的两位。