为什么要使用Ruby的属性

Ruby有这种方便和方便的方式来通过使用键等方式共享实例变量

attr_accessor :var
attr_reader :var
attr_writer :var

为什么我会选择attr_readerattr_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_readerattr_writer比手动输入他们所要求的方法更方便。 除此之外,它们比自己编写方法定义提供更好的性能。 欲了解更多信息,请参阅Aaron Patterson的演讲(PDF)。


并非所有对象的属性都是从课外直接设置的。 为所有实例变量编写代码通常是弱封装的标志,并且警告您在类之间引入了过多的耦合。

作为一个实际的例子:我写了一个设计程序,将物品放入容器中。 该项目有attr_reader :container ,但是提供一个作者是没有意义的,因为项目容器应该改变的唯一时间是放置在新的容器中,这也需要定位信息。

链接地址: http://www.djcxy.com/p/4379.html

上一篇: Why use Ruby's attr

下一篇: How to scp a folder from remote to local?