Ruby有这种方便快捷的方法,通过使用键来共享实例变量,如
attr_accessor :var
attr_reader :var
attr_writer :var
如果我可以简单地使用attr_accessor',我为什么要选择
attr_reader'或`attr_writer'?是否有类似性能的东西(我怀疑)?我想是有原因的,否则他们就不会做这样的键。
你可以使用不同的访问器来向阅读你的代码的人传达你的意图,并使你更容易写出无论如何调用其公共API都能正确工作的类。
class Person
attr_accessor :age
...
end
在这里,我可以看到,我既可以读也可以写年龄。
class Person
attr_reader :age
...
end
在这里,我可以看到我只能读取年龄。 想象一下,它是由这个类的构造函数设置的,之后保持不变。 如果有一个年龄的突变器(写入器),而这个类在编写时假设年龄一旦被设置就不会改变,那么代码在调用该突变器时就会产生一个错误。
但是幕后发生了什么?
如果你写
attr_writer :age
就会被翻译成。
def age=(value)
@age = value
end
如果你写
attr_reader :age
那就会被翻译成。
def age
@age
end
如果你写
attr_accessor :age
那就会被翻译成。
def age=(value)
@age = value
end
def age
@age
end
知道了这一点,我们可以用另一种方式来思考这个问题。如果你没有attr_...助手,而不得不自己写访问器,你会不会写更多的访问器来满足你的类的需要? 例如,如果年龄只需要被读取,你还会写一个允许它被写入的方法吗?