クラス 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
種メソッドはサブクラスの自己で定義されますが、:bark メソッドは常に Dog で定義されます (上書きされない限り)。