第一个问题是,如果一个变量的赋值语句出现了,虽然没有被执行,但这个变量就会被认为已经存在了,比较典型的例子是
x = 3 if false
defined? x
这段代码的结果是 x 是 local variable,虽然第一行没有被执行。
第二个问题就是最普通情况,x 没有被定义
记得初学 ruby 时看 ruby: from novice to professional 头几页也有介绍。 后来看别人的代码时,因为忘了,结果纠结半天。
2.0.0p247 :001 > code = <<END
2.0.0p247 :002"> x =2 if defined? x
2.0.0p247 :003"> END
=> "x =2 if defined? x\n"
2.0.0p247 :004 > puts RubyVM::InstructionSequence.compile(code).disasm
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1] s1)
[ 2] x
0000 trace 1 ( 1)
0002 putnil
0003 putobject "local-variable"
0005 swap
0006 pop
0007 branchunless 16
0009 putobject 2
0011 dup
0012 setlocal_OP__WC__0 2
0014 leave
0015 pop
0016 putnil
0017 leave
=> nil
#17 楼 @simlegate 在 parserx = 2 if defined? x
这段代码时,第一次遇到x
时它就会被定义,然后defined? x
的值就是true
了,所有x=2
就会被执行。