Ruby符号和属性

时间:2015-04-01 03:47:21

标签: ruby

当我创建属性时,我可以使用这样的符号:

class SomeClass
  attr_reader :variable1, :variable2
end 

当我使用关键字attr_reader(或attr_writer)并使用与某个实例变量相同的名称时,Ruby会自动将属性(或者说属性)与实例相关联具有相同名称的变量?

2 个答案:

答案 0 :(得分:2)

您需要了解attr_reader的作用。当你这样做时:

attr_reader :variable1, :variable2

它被翻译成:

def variable1
  @variable1
end
def variable2
  @variable2
end

正如您所看到的,variable1只是实例变量@variable1,其值是您在initialize方法中设置的。

所以,是的,Ruby确实将该属性与具有相同名称的实例变量相关联。

答案 1 :(得分:0)

不,没有关联。

attr_readerattr_writerattr_accessor不是关键字,它们就像任何其他方法一样。事实上,您可以自己轻松编写它们:

class Module
  def attr_reader(*attrs)
    attrs.each do |attr|
      define_method(attr) { instance_variable_get(:"@#{attr}") }
    end
  end

  def attr_writer(*attrs)
    attrs.each do |attr|
      define_method(:"#{attr}=") do |val| instance_variable_set(:"@#{attr}", val) end
    end
  end

  def attr_accessor(*attrs)
    attr_reader *attrs
    attr_writer *attrs
  end
end

这些方法所做的就是生成一些其他方法,这些方法的名称基于您传递给它们的符号。就是这样。