Ruby 中的对象变量

Object Variables in Ruby

我正在学习 Ruby 我在书上找到了这个代码示例,它是关于封装的。在这里:

class Person
    def initialize(name)
      set_name(name)
    end

   def name
      @first_name + " "+ @last_name
   end

   def set_name(name)
      first_name, last_name = name.split(/\s+/)
      set_first_name(first_name)
      set_last_name(last_name)
   end

   def set_first_name(name)
      @first_name = name
   end

   def set_last_name(name)
      @last_name = name
   end
end

我的问题是他为什么不把属性first_name和last_name像实例变量放在这一行first_name, last_name = name.split(/\s+/)?因为在其他行中他用@符号解决了它们?

这是因为类中的@表示对象实例独有的实例变量。

set_name 方法中,first_namelast_name 对于创建它们的方法是局部的。因此作者省略了@。他不想更改其他方法中使用的实例变量。这就是他说的封装。用户不能直接访问这些变量,而是让对象通过 set_first_nameset_last_name 方法更改它们。

回想起来,这些变量名很糟糕,因为已经存在一些同名的实例变量。

这似乎只是一个设计决定。也许他只想在一个地方设置实例变量。

如果以后需要在 setter 中执行更多步骤,或者如果他真的需要更改实例变量名称或其他任何东西,这可以让他在以后有一些灵活性。

既然这本书是讲封装的,他可能是在小心翼翼地尽可能封装那些实例变量。