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