ruby中的实例变量
有人能告诉我这里发生了什么事吗。为什么y是实例变量?为什么不是ruby中的实例变量,ruby,Ruby,有人能告诉我这里发生了什么事吗。为什么y是实例变量?为什么不是self是一个实例,y是一个实例变量。在第一个示例中,y只是一个普通的局部变量。为什么不呢self是一个实例,y是一个实例变量。在第一个示例中,y只是一个普通的局部变量。attr\u访问器:y定义了与 class Sample attr_accessor :x,:y def initialize @x = "x" y = "y" end end Sample.new
self
是一个实例,y
是一个实例变量。在第一个示例中,y
只是一个普通的局部变量。为什么不呢self
是一个实例,y
是一个实例变量。在第一个示例中,y
只是一个普通的局部变量。attr\u访问器:y
定义了与
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]
因此,当您分配给
self.y
时,由于attr\u访问器
宏attr\u访问器:y
定义了与
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]
因此,当您分配给
self.y
时,由于这一行的attr\u访问器
宏,您正在分配给一个实例变量
def y
@y
end
def y=(val)
@y = val
end
创建两个方法
attr_accessor :y
因此,当您调用y=
方法时,@y
实例变量跳转到活动状态。在第二个代码段中,您正确地调用了y=
方法。但是在第一种方法中,您只需创建一个未使用的局部变量y
(不调用setter方法,也不创建ivar)。此行
def y
@y
end
def y=(val)
@y = val
end
创建两个方法
attr_accessor :y
因此,当您调用
y=
方法时,@y
实例变量跳转到活动状态。在第二个代码段中,您正确地调用了y=
方法。但是在第一个示例中,您只需创建一个未使用的局部变量y
(不调用setter方法,也不创建ivar)。在第一个示例中,如果您指定:@y=1
,那么您也将得到@y
。我猜想Ruby正在attr\u访问器中进行优化,并且在您专门为其赋值之前不会创建ivar。并且@Zabba:在您为其赋值之前,变量不存在。请参见第一个示例,如果您分配:@y=1
,那么您也将获得@y
。我猜想Ruby正在attr\u访问器中进行优化,并且在您专门为其赋值之前不会创建ivar。并且@Zabba:在您为其赋值之前,变量不存在。请仔细阅读术语<代码>self.y=1
不是对ivar的赋值“由于…”而赋值给实例变量”。我想这清楚地说明了为什么你有ivar,而不是作业:|小心术语<代码>self.y=1
不是对ivar的赋值“由于…”而赋值给实例变量”。我想这清楚地说明了为什么要使用ivar,而不是赋值:|需要注意的是,历史上,attr\u accessor
的基准测试速度要比这些等效方法快,它们是基于C的优化,而不是可执行代码,因此,只要有可能,您就应该使用attr\u
声明,而不是编写自己的声明。需要注意的是,从历史上看attr\u访问器
的基准测试速度要比这些等效方法快,它们是基于C的优化,而不是可执行代码,因此,只要有可能,您就应该使用attr\uu
声明,而不是编写自己的声明。