用于重命名对象的实例方法和 setter 方法有什么区别?

What is the difference between an instance method used to rename an object and a setter method?

如果我想在下面重命名我的 jedi 对象,为什么我要创建一个名为 rename 的实例方法,它使用 setter 方法 name=?为什么不直接使用 setter 方法 `name=' 呢?

为什么这样做:

     class Skywalker
       attr_accessor :name

       def initialize(name)
         @name = name
       end

       def rename(new_name)
         self.name = new_name
       end
     end

     jedi = Skywalker.new('Anakin')
     puts jedi.name
     jedi.rename('Luke')
     puts jedi.name

你什么时候可以做到这一点:

     class Skywalker
       attr_accessor :name

       def initialize(name)
         @name = name
       end
     end

     jedi = Skywalker.new('Anakin')
     puts jedi.name
     jedi.name = 'Luke'
     puts jedi.name

上面的两个代码片段都做同样的事情,所以我想知道是否存在这样一种情况,除了 setter 方法 rename 实例方法 rename 是否有用 name=。因为在我看来它们是多余的。

#rename 隐藏了实现细节。您公开了一个干净明确的接口——一个对象可以重命名,但调用者不必关心它是如何完成的。我建议使用 attr_reader :name 而不是 attr_accessor :name 以避免暴露 setter.

如果您只公开 #name=,您可以让调用者更改对象内部结构。这可能会导致未来的变化更加困难(例如,如果您将 name 移动到一个单独的对象)。