问题

Ruby 中的对象没有属性的概念,比起一些静态语言(如 Java)少了很多 self 前缀的调用情况。在 Ruby 项目中,为了代码简洁和符合大家习惯,我们应该了解一下 需要 self 的情况有哪些。

总结来说,只有两个情况需要:

  • setter 方法
  • 与 ruby 关键字同名的方法

setter 方法

class Cat
  attr_accessor :color
  
  def initialize
    self.color = :red
  end
end

上面的 self 是不能省略的,因为该语句其实是

self.color=(:red)

的语法糖,在 Ruby 中被称为 setter 方法。如果你使用完整方法(带括号)调用形式,是可以不用 self 的,但是一旦你使用了上述的语法糖形式,你就必须加上了。 因为没有指定对象的 setter 方法和局部变量的声明与赋值语法一样,Ruby 会优先理解成此处需要声明并赋值一个局部变量。

与 ruby 关键字同名的方法

class Dog
  def class_name
    self.class.name
  end
end

上述的 self 也不能省略,因为此处的方法名 class 跟关键字同名,为了语法解析好过一点(现在的情况是根本跑不过),我们还是乖乖显示加上对象吧。

该类情况除了上述的 class,还会有其他情况,这些情况会跟着 Ruby 语言的迭代和或者自定义方法的添加而不同,因此需要时刻注意,我们能做的就是尽量避免自己添加 和关键字同名的方法。