在 Dog 类中,self 是“Dog”类(每个类都有一个“类”对象,有时称为元类或特征类)。
以一种棘手的方式,ruby 中的所有方法都是实例方法。
def self.species
在“类类”上声明一个物种方法,这使得它(表现得像)一个类方法。
相似地,
d = Dog.new
def d.bark; puts "woof"; end
向“d”实例添加方法
至于两者的区别
class << self
def species
和
def self.species
它们在功能上完成了同样的事情。正如其他人所提到的,选择一种格式而不是另一种格式是一种风格。def self.species 是声明“类”方法的常用方法。
我主要会使用
class << self
attr_accessor :species
end
如果我想让属性访问器在类级别而不是实例上操作。
理解这一点对于使用像包含的模块这样的钩子很重要
module Sound
def self.included(host_class)
def host_class.speak(sound)
define_method(:bark) do
sound
end
end
end
end
class Dog
include Sound
speak "woof"
end
Dog.new.bark
另外,为了完整性
class Dog
def self.species
puts self.to_s
end
def Dog.bark
puts self.to_s
end
end
class Spaniel < Dog; end
species 方法在任何子类的 self 上定义,而 :bark 方法总是在 Dog 上定义(除非被覆盖)