Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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_Instance Variables_Self - Fatal编程技术网

Ruby 我猜是红宝石的内部结构

Ruby 我猜是红宝石的内部结构,ruby,instance-variables,self,Ruby,Instance Variables,Self,控制台上带有“内部getter”的结果 myclass.function2 没有 我是Ruby新手,不知道有什么不同,在网上找不到 提前谢谢 编辑: 我假设通过添加“=”可以覆盖隐式定义的实例变量“instance_variable”的getter方法 这也是我这样称呼它的原因 Im过去不允许在函数名中使用“=” 这就是为什么我认为它会有一些特殊的意义 谢谢你的帮助 编辑2: 我只是觉得我真的覆盖了作业,而不仅仅是获取者。我把一切都搞混了 对不起,谢谢。您已经(误导性地)将setter命名为实例

控制台上带有“内部getter”的结果

myclass.function2

没有

我是Ruby新手,不知道有什么不同,在网上找不到

提前谢谢

编辑:

我假设通过添加“=”可以覆盖隐式定义的实例变量“instance_variable”的getter方法

这也是我这样称呼它的原因

Im过去不允许在函数名中使用“=”

这就是为什么我认为它会有一些特殊的意义

谢谢你的帮助

编辑2:

我只是觉得我真的覆盖了作业,而不仅仅是获取者。我把一切都搞混了

对不起,谢谢。

您已经(误导性地)将setter命名为
实例变量
。它不是一个实例变量,而是一个设置实例变量的方法

当您调用
self.instance\u variable=
时,您正在调用该方法。当您直接设置
@instance\u variable
时,您正在设置变量本身,这就是为什么不调用setter方法的原因

更惯用的命名约定如下:

class MyClass

  def instance_variable=(var)
    puts "inside getter"
    instance_variable = var
  end

  def function_1
    self.instance_variable = "whatever"
  end

  def function_2
    @instance_variable = "whatever"
  end

end



myclass = MyClass.new

myclass.function1
当然,为了简单起见,可以使用传递类型getter和setter

def name=(value)
  @name = value
end
上面的方法是语法糖,它们为您生成get和/或set方法。如果需要,可以稍后重写它们以提供附加功能


编辑:我看到您进行了更新,只是想指出此方法根本没有设置实例变量:

attr_reader :name #generates getter only
attr_writer :name #generates setter only, not very common
attr_accessor :name #generates getter and setter

在这种情况下,
instance\u变量
只是一个局部变量,一旦方法退出就会被丢弃。局部变量优先于实例方法,并且实例变量总是以
@
符号开头。

但是ruby根本不会为您这样做,除非您使用我在回答中显示的attr_xxx语法。我想要的是一个实例变量。没有办法明确地定义它,这就是为什么我将该方法本身称为“instance_variable=”。我的假设是,添加“=”符号使其成为实例变量“instance_variable”的getter。我喜欢覆盖它。但现在我想,“=”并不能做到这一点。只是一个角色?像“a-Z”?@krzysiek:“没有办法明确地定义它”-我不确定你的意思。您当然可以定义一个实例变量,只需声明并初始化它,即,
@some_instance_var=1
。方法末尾的
=
将使其成为setter,而不是getter,并且它确实有意义。这意味着您可以像
my_property=1
那样使用它,也就是说,它看起来像是分配一个字段,但实际上您正在调用
my_property=(value)
方法。。。这就是我在网上看到的。。。我们不会像“@some_instance_var=1”那样明确地定义实例变量,而只是通过定义setter和getter方法(def instance_var(value)/@instance_var=value/end/def instance_var/@instance_var/end)隐式地定义。比如说因为Ruby是动态的或者什么的。@krzysiek:不,那不是真的。您也可以定义实例变量,如果它们是类的内部实现的一部分,而不是公共接口的一部分,那么就应该这样定义它们。
def instance_variable=(var)
  puts "inside getter"
  instance_variable = var
end