In der Klasse Dog ist self die 'Dog'-Klasse (jede Klasse hat ein' class'-Objekt, manchmal auch eine Meta-Klasse oder Eigenklasse genannt).
In einer kniffligen Weise sind alle Methoden in Ruby Instanzmethoden.
def self.species
deklariert eine Spezies-Methode auf der 'Klassen-Klasse', die es (verhält sich) wie eine Klassenmethode macht.
Ähnlich
d = Dog.new
def d.bark; puts "woof"; end
fügt eine Methode, um die 'D' Instanz
Was den Unterschied zwischen
class << self
def species
und
def self.species
sie funktionell voll th Das Gleiche. Die Auswahl eines Formats gegenüber dem anderen, wie in anderen erwähnt, ist stilistisch. def.Species ist die übliche Methode, um Klassenmethoden zu deklarieren.
meist würde ich
class << self
attr_accessor :species
end
verwenden, wenn ich ein Attribut Accessor auf der Ebene der Klassen arbeiten zu wollen, war zu machen, anstatt Instanz.
Verständnis dieser zu verwenden Haken wichtig ist wie das Modul
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
Ebenfalls enthalten, der Vollständigkeit halber
class Dog
def self.species
puts self.to_s
end
def Dog.bark
puts self.to_s
end
end
class Spaniel < Dog; end
Die Art Verfahren basiert auf der Selbst von allen Unterklassen definiert, während der: Rinden Verfahren ist immer auf Hund definiert (wenn nicht überschrieben)
'Hund.species' ist problematisch, wenn Sie den Klassennamen später ändern. Verwenden Sie besser "self.species". –