为什么在初始化时没有使用setter方法?

big*_*ato 11 ruby oop

最近我一直在阅读"Ruby中的实用面向对象设计",我注意到最好的做法之一是使用访问器方法而不是直接抓取@instance_variable.例如:

class Foo
  attr_accessor :bar

  def initialize(my_argument)
    @bar = my_argument
  end

  # bad
  # def lorem_ipsum
  #     @bar * 999
  # end

  # good
  def lorem_ipsum
    bar * 999
  end

end
Run Code Online (Sandbox Code Playgroud)

将事情保持干燥是有道理的,并且,如果我需要@bar在实际获取其价值之前以某种方式处理.但是,我注意到该initialize方法@bar直接设置实例变量的值:

class Foo
  attr_accessor :bar

  def initialize(my_argument)
    @bar = my_argument #<-- why isn't self.bar = my_argument used here?
  end
Run Code Online (Sandbox Code Playgroud)

是否有一个原因?是不是应该使用setter方法而不是直接使用=运算符来设置实例变量的值?

Jör*_*tag 7

你是对的,这样做会更有意义

class Foo
  attr_accessor :bar

  def initialize(my_argument)
    self.bar = my_argument
  end
end
Run Code Online (Sandbox Code Playgroud)

不同的参数,你是否应该尊重封装的对象本身或没有,但如果你相信这一点,那么,是的,你应该这样做.