当我创建属性时,我可以使用这样的符号:
class SomeClass
attr_reader :variable1, :variable2
end
当我使用关键字attr_reader
(或attr_writer
)并使用与某个实例变量相同的名称时,Ruby会自动将属性(或者说属性)与实例相关联具有相同名称的变量?
答案 0 :(得分:2)
您需要了解attr_reader
的作用。当你这样做时:
attr_reader :variable1, :variable2
它被翻译成:
def variable1
@variable1
end
def variable2
@variable2
end
正如您所看到的,variable1
只是实例变量@variable1
,其值是您在initialize
方法中设置的。
所以,是的,Ruby确实将该属性与具有相同名称的实例变量相关联。
答案 1 :(得分:0)
不,没有关联。
而attr_reader
,attr_writer
,attr_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
这些方法所做的就是生成一些其他方法,这些方法的名称基于您传递给它们的符号。就是这样。