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?
答案 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)。