我一直在顶层使用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
看起来第二个例子展示了实例变量的工作原理。如果在类内定义实例变量,则其仅存在于该范围内,并且不存在于实例方法中。
那么我的问题是...为什么第一个例子输出 'foo',当变量 @x 不应该存在于实例方法的范围内? 另外,在顶层类中定义变量的正确方法是什么,以便您可以在顶级方法中使用它们?
Test.instance_variable_get(:@x)
- 实例变量@x
已经在Test
类上定义(它是一个类型为Class
的对象)- 可能需要一些时间才能意识到这意味着什么,但这是理解Ruby的关键部分。 - Neil Slater