混淆了实例变量范围,顶级与类

时间:2013-07-27 19:53:55

标签: ruby

我一直在使用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'?另外,在顶级类中定义要用于顶级方法的变量的正确方法是什么?

2 个答案:

答案 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