为什么使用Ruby的attr_accessor,attr_reader和attr_writer?

  • 回答 (2)
  • 关注 (0)
  • 查看 (72)

Ruby有这样一个方便方便的方法来使用键来共享实例变量

  • attr_accessor :va
  • attr_reader :va
  • attr_writer :va

为什么我会选择,attr_reader或者attr_writer如果我可以简单地使用attr_accessor?有没有像表演(我怀疑)?我猜这是有原因的,否则就不会有这样的关键。

problemproblem提问于
MyLove回答于

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

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

akjok54stay hungry stay foolish回答于

可以使用不同的访问器将您的意图传达给读取您的代码的人,并且使得编写能够正确工作的类更容易,无论他们的公共API如何被调用。

class Person
  attr_accessor :age
  ...
end

在这里,我可以看到我可以读写这个时代。

class Person
  attr_reader :age
  ...
end

在这里,我可以看到,我只能读年龄。想象一下,它是由这个类的构造函数设置的,之后保持不变。如果有一个年龄增长的变种人(编者),而且这个班级是在假设年龄的情况下编写的,那么一旦设置,就不会改变,那么调用这个变种人的代码就会导致一个bug。

但幕后发生了什么?

如果你写:

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

扫码关注云+社区

领取腾讯云代金券