Ruby 有这种方便快捷的方式来共享实例变量,方法是使用类似的键
attr_accessor :var attr_reader :var attr_writer :var
我为什么要选择attr_reader或者attr_writer我可以简单地使用attr_accessor?有没有类似性能的东西(我怀疑)?我想这是有原因的,否则他们不会制造这样的钥匙。
attr_reader
attr_writer
attr_accessor
您可以使用不同的访问器将您的意图传达给阅读您的代码的人,并使编写无论如何调用公共 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_… 帮助器,并且必须自己编写访问器,你会编写比你的类需要更多的访问器吗?例如,如果只需要读取年龄,您是否还会编写一个允许写入的方法?