我主要在顶层使用 Ruby,我通常编写如下代码:
@x = 'foo'
def show_var
puts @x
end
show_var # => foo
根据这个例子的工作原理,我认为实例变量对类和对象都可用。
今天遇到这个问题,看来我对实例变量的理解有误:
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
看起来第二个例子是实例变量的工作原理。如果您在类内部定义一个实例变量,那么它只存在于该范围内,而不存在于实例方法中。
那么我的问题是……当变量@x 不应存在于实例方法的范围内时,为什么第一种情况会输出“foo”?此外,在顶级类中定义要用于顶级方法的变量的正确方法是什么?
最佳答案
第一个例子中的方法在顶层。这意味着它属于一个特殊的顶级对象 main
。您实际上无法创建更多的 main
副本,因此该方法内部和外部的 self
是相同的。检查一下:
self # => main
def show_var
self # => main
end
class Test
self # => Test
def show_var
self # => #<Test:0x007fdf9c892d70>
end
end
关于ruby - 对实例变量范围、顶级与类感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901882/