ruby中的实例变量

时间:2013-02-01 06:58:54

标签: ruby

 class Sample
   attr_accessor :x,:y

   def initialize 
     @x = "x"
     y = "y"     
   end
 end     

 Sample.new.instance_variables  => [:@x] 

class Sample
  attr_accessor :x,:y

  def initialize 
     @x = "x"
     self.y = "y"     
  end
end  

Sample.new.instance_variables => [:@x, :@y] 

任何人都可以让我知道这里发生了什么。为什么第二次y是instance_variable?

3 个答案:

答案 0 :(得分:8)

attr_accessor :y定义大致相当于

的方法
def y
  @y
end

def y=(val)
  @y = val
end

因此,当您分配到self.y时,由于attr_accessor

,您正在分配实例变量

答案 1 :(得分:1)

为什么不呢? self是一个实例,y是一个实例var。在第一个示例中,y只是一个普通的局部变量。

答案 2 :(得分:1)

这一行

attr_accessor :y

创建了几个方法

def y
  @y
end

def y= val
  @y = val
end

因此,当您调用y=方法时,@y实例变量会跳转到生命。在第二个代码段中,您正确调用了y=方法。但是在第一个中你只是创建一个未使用的局部变量y(不调用setter方法而不创建ivar)。