3

我一直在玩 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

看起来第二个示例是实例变量的工作方式。如果在 Class 内部定义了一个实例变量,那么它只存在于该范围内,对于实例方法不存在。

那么我的问题是......为什么当变量@x 不应该存在于实例方法的范围内时,第一种情况会输出'foo'?另外,在要用于顶级方法的顶级类中定义变量的正确方法是什么?

4

2 回答 2

5

第一个示例中的方法位于顶层。这意味着它属于一个特殊的顶级对象main。您不能真正创建更多副本main,因此self该方法的内部和外部是相同的。看一下这个:

self # => main
def show_var
  self # => main
end

class Test
  self # => Test
  def show_var
    self # => #<Test:0x007fdf9c892d70>
  end 
end
于 2013-07-27T19:58:26.750 回答
1

往下看:

@x = 'foo'
def show_var
  puts @x,self
  p defined? @x
end

show_var
# >> foo
# >> main
# >> "instance-variable"

在第一种情况下,您@xmain范围中定义。然后当调用方法时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
于 2013-07-27T19:58:40.660 回答