为什么要使用Ruby的属性
Ruby有这种方便和方便的方式来通过使用键等方式共享实例变量
attr_accessor :var
attr_reader :var
attr_writer :var
为什么我会选择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 _...助手,并且必须自己编写访问器,你会写更多的访问器吗? 例如,如果只需要阅读年龄,您是否也会编写一个允许写入的方法?
以上所有答案都是正确的; attr_reader
和attr_writer
比手动输入他们所要求的方法更方便。 除此之外,它们比自己编写方法定义提供更好的性能。 欲了解更多信息,请参阅Aaron Patterson的演讲(PDF)。
并非所有对象的属性都是从课外直接设置的。 为所有实例变量编写代码通常是弱封装的标志,并且警告您在类之间引入了过多的耦合。
作为一个实际的例子:我写了一个设计程序,将物品放入容器中。 该项目有attr_reader :container
,但是提供一个作者是没有意义的,因为项目容器应该改变的唯一时间是放置在新的容器中,这也需要定位信息。
上一篇: Why use Ruby's attr