You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ruby中conditions与defined?运算符异常行为及代码差异问询

两段Ruby代码的差异解析

核心原因是局部变量var被Ruby标记为“已定义”的时机完全不同,具体拆解如下:

第一段代码的执行逻辑

if defined?(var).nil?
  var = true
end
puts "[#{var}]"

当执行这段代码时,进入if条件判断的瞬间,var这个名字从来没有在当前作用域里出现过。defined?(var)会返回nil,条件成立,于是执行var = true给变量赋值。最后puts输出[true],符合你的预期。

第二段代码的执行逻辑

var = true if defined?(var).nil?
puts "[#{var}]"

Ruby的解析器有个特殊规则:只要在作用域里扫描到局部变量的名字(哪怕是写在赋值语句的左边),就会立刻把这个变量标记为“已定义”——哪怕还没真正给它赋值,它的初始值是nil

所以当解析这段代码时,解析器先看到了赋值左边的var,直接把它标记为已定义变量。接下来计算条件defined?(var).nil?时,defined?(var)会返回字符串"local-variable"(表示这是一个已定义的局部变量),而不是nil,条件不成立,var = true这个赋值操作根本不会执行。最后var的值还是初始的nil,插值到字符串里就是空的,所以puts输出[]

简单总结:Ruby对局部变量的“定义判定”是提前扫描整个语句做标记的,不是按代码执行顺序逐步判断的,这就是两段代码结果不同的关键。

内容的提问来源于stack exchange,提问作者Gus

火山引擎 最新活动