Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中的实例变量_Ruby - Fatal编程技术网

ruby中的实例变量

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

有人能告诉我这里发生了什么事吗。为什么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.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
声明,而不是编写自己的声明。