Ruby

keating · 2013年02月11日 · 最后由 2gua 回复于 2013年02月13日 · 2847 次阅读
b=(defined? b)?b : "yeah!"

结果是啥...

虽然 = 是右结合的运算符,但 defined? 还是先看左边的

@jjym @luikore 你俩好给力...

这个问题的原因不是因为 Ruby 里变量出现过就是有定义的么,不一定要执行到。比如:

if false
  var = 1
end
puts defined?(var) # => local-variable

还有一个例子是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 这个变量了。 在变量是否存在的判定上,都要注意这个:)

赞成上两楼的两位。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号