class << Awesomeness
Wofür ist das <<
? Ich habe gesucht, aber die Ergebnisse sagen nur etwas über die Verkettung von Zeichenfolgen aus ...
Während es wahr ist, dass dies class << something
die Syntax für eine Singleton-Klasse ist, wie jemand anderes sagte, wird sie am häufigsten verwendet, um Klassenmethoden innerhalb einer Klassendefinition zu definieren. Diese beiden Verwendungen sind jedoch konsistent. Hier ist wie.
Mit Ruby können Sie einer bestimmten Instanz Methoden hinzufügen, indem Sie Folgendes tun:
class << someinstance
def foo
"Hello."
end
end
Dies fügt einer foo
Instanz eine Methode hinzu, nicht ihrer Klasse, sondern dieser einen bestimmten Instanz. (Tatsächlich wird foo zur "Singleton-Klasse" der Instanz hinzugefügt, aber das ist mehr oder weniger eine Implementierungs-Eigenart.) Nachdem der obige Code ausgeführt wurde, können Sie die Methode foo an eine Instanz senden:
someinstance.foo => "Hello."
Sie können foo jedoch nicht an andere Instanzen derselben Klasse senden. Dafür <<
ist nominell. Diese Funktion wird jedoch häufiger für syntaktische Gymnastik wie diese verwendet:
class Thing
def do_something
end
class << self
def foo
puts "I am #{self}"
end
end
end
Was ist, wenn dieser Code - diese Klassendefinition - ausgeführt wird self
? Es ist die Klasse Thing
. Dies bedeutet, class << self
dass Sie der Klasse Thing die folgenden Methoden hinzufügen. Das heißt, foo ist eine Klassenmethode. Nachdem der obige Vorgang abgeschlossen ist, können Sie Folgendes tun:
t = Thing.new
t.do_something => does something
t.class.foo => "I am Thing"
t.foo => NoMethodError: undefined method `foo'
Und wenn Sie darüber nachdenken, was <<
gerade passiert, macht alles Sinn. Es ist eine Möglichkeit, an eine bestimmte Instanz anzuhängen, und im allgemeinen Fall ist die angehängte Instanz eine Klasse, sodass die Methoden innerhalb des Blocks zu Klassenmethoden werden.
Kurz gesagt, es ist eine knappe Möglichkeit, Klassenmethoden innerhalb eines Klassendefinitionsblocks zu erstellen. Ein anderer Weg wäre, dies zu tun:
class Thing
def self.foo
# ...
end
end
Gleiche Sache. Ihr Beispiel ist eigentlich ein Syntaxfehler. Wenn Sie jedoch <<
wissen, wie Instanzen und das Schlüsselwort class verwendet werden, wissen Sie, wie Sie ihn korrigieren können.
class << self
in dem Sinne funktioniert, dass es sich zwarThing
um eine Klasse handelt, aber auch nur um eine Instanz ihrer Oberklasse. Klassen und Instanzen haben also nichts Besonderes. Jede Klasse in Ruby ist eine Instanz ihrer Oberklasse (außer BasicObject).<<
ist die Syntax für "Singleton-Klassendefinition" . Hier ist ein Beispiel dafür, wo / wie es "normalerweise" verwendet wird.Darin
a = "abc"; a << "xyz"
ist die Syntax für "Anhängen von Daten" (an Zeichenfolge, Array usw.)quelle
<<
heißt dasshovel operator
Wenn Sie eine Vererbung wünschen (basierend auf Ihrem Fragentitel), möchten Sie eine einzelne
<
:class Awesome < ParentAwesomeness
Der von Ihnen angegebene Code ist kein gültiger Ruby:
class Awesomeness end class Awesome << Awesomeness end SyntaxError: (irb):3: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n'
quelle