我猜一些Ruby内部

时间:2011-05-23 17:24:52

标签: ruby instance-variables self

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

结果与控制台上的“内部吸气器”

myclass.function2

没有。

我是Ruby新手,不知道差异,无法在网上找到它......

提前致谢!

编辑:

我假设通过附加“=”,我为隐式定义的实例变量“instance_variable”覆盖了一个getter方法。

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

我不习惯在函数名中使用“=”。

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

感谢您的帮助。

EDIT2:

我只是认为我真的覆盖了作业而不仅仅是吸气剂。我把它搞砸了。

抱歉,谢谢。

1 个答案:

答案 0 :(得分:4)

你有(误导性)命名你的二传手instance_variable。它不是实例变量,它是一个设置实例变量的方法。

当您致电self.instance_variable=时,您正在调用该方法。直接设置@instance_variable时,您自己设置变量,这就是不调用setter方法的原因。

更惯用的命名约定如下:

def name=(value)
  @name = value
end

当然,简单来说,传递类型的getter和setter可以使用

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

上述方法是语法糖,它为您生成get和/或set方法。如果需要,可以稍后重写它们以提供其他功能。


编辑:我看到你做了一个更新,只是想指出这个方法根本没有设置实例变量:

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

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