Ich verbrachte einige Zeit mit irb herumgespielt und kam mit dieser:
class BasicObject
def class
klass = class << self; self; end # get the object's singleton class
klass.superclass # the superclass of an object's singleton class is that object's class
end
end
, dass jedes Objekt geben wird, die von Basicobject eine #class
Methode erbt, die Sie aufrufen können.
bearbeiten
Weitere Erklärungen wie in den Kommentaren angefordert:
Sagen Sie bitte Objekt obj
haben, die eine Instanz der Klasse ist Foo
. obj
ruft seine Instanzmethoden von denen ab, die innerhalb der Klasse Foo
definiert sind, zusätzlich zu den Methoden, die in der übergeordneten Klasse Foo
usw. definiert sind, und so weiter die Vererbungskette. Ruby können Sie Methoden direkt auf ein Objekt definieren, wie diese
obj = Foo.new
def obj.hello
puts "hello"
end
obj.hello #=> hello
other_obj = Foo.new
other_obj.hello #=> Method missing error
Der Grund, warum Sie dies tun können, um dieses Objekt nur zugänglich sind, weil jedes Objekt etwas ein Singleton-Klasse genannt hat (oder manchmal ein Eigenklasse nennen), dass Sie definieren die Methode tatsächlich. Diese Singleton-Klasse existiert tatsächlich in der Vererbungskette des Objekts direkt unter der tatsächlichen Klasse des Objekts. Das macht die tatsächliche Klasse des Objekts Foo
in diesem Beispiel die Oberklasse der Singleton-Klasse des Objekts.
Die Zeile class << self
, die Sie in der Antwort sehen, ist eine spezielle Syntax zum Eingeben des Gültigkeitsbereichs der Singleton-Klasse eines Objekts. So in dem obigen Beispiel könnte man auch ein Verfahren in einem Singleton-Klasse des Objekts definieren, wie diese
class << obj
def goodbye
puts "goodbye"
end
end
obj.goodbye #=> goodbye
So ist die Linie class << self; self; end
ist das Singleton Klasse des Objekts zu öffnen (was auch immer Objekt ist derzeit self
) und dann self
Rückkehr (self
hat jetzt die Singleton-Klasse), die dann einer Variablen zugewiesen werden kann, um das zu tun, was Sie wünschen.
Ich würde empfehlen, Metaprogramming Ruby zu lesen, wenn Sie eine bessere Erklärung von all dem wollen. Es gibt Ihnen auf jeden Fall ein viel besseres Verständnis des Ruby-Objektmodells als Ganzes.
Können Sie geben etwas konkreteres Beispiel für das, was Sie versuchen zu tun? Fragen Sie: "Wenn ich eine Klasse Foo habe, die von BasicObject erbt, gibt es eine Möglichkeit zu identifizieren, dass eine Instanz dieser Klasse 'Foo' im Gegensatz zu BasicObject ist"? Nicht sicher, was du fragst. –
Eigentlich ja genau! Ändern des Beitrags zur Klärung – Jwosty
'MyObjectSystem.class.name'? –