我一直在使用Ruby,主要是在顶层,我通常编写如下代码:
@x = 'foo'
def show_var
puts @x
end
show_var # => foo
我认为实例变量可用于Class和Object,基于此示例的工作原理。
今天我碰到了这个,看起来我对实例变量的理解不正确:
class Test
@x = "foo" #you would need to define this inside 'initialize' for this to be available to show_var
def show_var
puts @x
end
end
Test.new.show_var # => nil
看起来第二个例子是实例变量的工作原理。如果在Class中定义了一个实例变量,那么它只存在于该范围内,并且对于实例方法不存在。
然后我的问题是......当变量@x不应该存在于实例方法的范围内时,为什么第一种情况输出'foo'?另外,在顶级类中定义要用于顶级方法的变量的正确方法是什么?
答案 0 :(得分:5)
第一个示例中的方法位于顶层。这意味着它属于特殊的顶级对象main
。您无法真正创建main
的更多副本,因此该方法内外的self
是相同的。看看这个:
self # => main
def show_var
self # => main
end
class Test
self # => Test
def show_var
self # => #<Test:0x007fdf9c892d70>
end
end
答案 1 :(得分:1)
看下面:
@x = 'foo'
def show_var
puts @x,self
p defined? @x
end
show_var
# >> foo
# >> main
# >> "instance-variable"
在第一种情况下,您在@x
范围内定义了main
。然后,当从show_var
调用方法main
时,您得到@x
的输出,而不是另一个的输出。
class Test
@x = "foo"
def show_var
p @x,self
p defined? @x
end
end
Test.new.show_var
# >> nil
# >> #<Test:0x9b6fcd4>
# >> nil