1
 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?

4

3 回答 3

8

attr_accessor :y定义大致等价于的方法

def y
  @y
end

def y=(val)
  @y = val
end

因此,当您分配给 时self.y,由于attr_accessor宏而分配给实例变量

于 2013-02-01T07:01:22.410 回答
1

为什么不?self是一个实例并且y是一个实例变量。在第一个示例中,y它只是一个普通的本地 var。

于 2013-02-01T07:01:03.090 回答
1

这条线

attr_accessor :y

创建几个方法

def y
  @y
end

def y= val
  @y = val
end

因此,当您调用y=方法时,@y实例变量会立即生效。在第二个片段中,您正确调用了y=方法。但是在第一个中,您只需创建一个未使用的局部变量y(不调用 setter 方法并且不创建 ivar)。

于 2013-02-01T07:02:06.277 回答