Ich lerne Ruby und habe kürzlich etwas entdeckt, das ich nicht ganz verstanden habe. Beim Einmischen von Modulen in Klassen kann ein Klassenobjekt nicht auf die Modulinstanzmethoden zugreifen.Warum haben Klassenobjekte im Kernelmodul Zugriff auf Instanzmodule?
module Swimmable
def swim
puts 'can swim'
end
end
class Fish
include Swimmable
end
Fish.swim
Ergebnis ist die undefined method 'swim' for Fish:Class (NoMethodError)
jedoch Verfahren, wenn die Instanz erwartet wird, in dem Kernel-Modul definiert ist, ich es mit einem Klassenobjekt und ein Instanz-Objekt zugreifen kann.
module Kernel
def swim
puts 'can swim'
end
end
class Fish; end
Fish.swim # => can swim
Fish.new.swim # => can swim
Was die Objektklasse macht Fish
können Instanzmethoden im Kernel-Modul zugreifen?
Wenn Sie 'Swimmable' für Ihr Klassenobjekt verfügbar haben möchten, schreiben Sie 'extend Swimmable' in' Fish'. Auf diese Weise müssen Sie das Modul nicht in 'Kernel' definieren. Weiterführender Suchbegriff: _singleton class_ –