Gibt es einen Unterschied zwischen ::Und .beim Aufrufen von Klassenmethoden in Ruby?

StackOverflow https://stackoverflow.com/questions/43134

  •  09-06-2019
  •  | 
  •  

Frage

Einfache Frage, aber eine, die mich neugierig gemacht hat ... Gibt es einen funktionalen Unterschied zwischen den folgenden beiden Befehlen?

String::class
String.class

Beide tun, was ich erwarte – das heißt, sie kehren zurück Class -- aber was ist der Unterschied zwischen der Verwendung von :: und das .?

Mir ist aufgefallen, dass bei den Klassen, für die Konstanten definiert sind, die automatische Vervollständigung von IRB die Konstanten als verfügbare Optionen zurückgibt, wenn Sie danach die Tabulatortaste drücken :: aber nicht danach ., aber ich weiß nicht, was der Grund dafür ist ...

War es hilfreich?

Lösung

Der . Der Operator sagt im Grunde „Sende diese Nachricht an das Objekt“.In Ihrem Beispiel wird dieses bestimmte Mitglied aufgerufen.Der :: Der Operator führt einen Drilldown auf den links vom Operator definierten Bereich durch und ruft dann das auf der rechten Seite des Operators definierte Mitglied auf.

Wenn Sie verwenden :: Sie müssen auf definierte Mitglieder verweisen.Beim Benutzen . Sie senden lediglich eine Nachricht an das Objekt.Da diese Nachricht alles Mögliche sein kann, funktioniert die automatische Vervollständigung nicht . während es für ::.

Andere Tipps

Tatsächlich funktioniert die automatische Vervollständigung ..Die Vervollständigungsoptionen werden durch Aufruf gefunden #methods am Objekt.Sie können dies selbst sehen, indem Sie es überschreiben Object.methods:

>> def Object.methods; ["foo", "bar"]; end
=> nil
>> Object.[TAB]
Object.foo  Object.bar
>> Object.

Beachten Sie, dass dies nur funktioniert, wenn der Ausdruck links davon steht . ist ein Literal.Andernfalls wird das aufzurufende Objekt abgerufen #methods Dies würde eine Beurteilung der linken Seite erfordern, was Nebenwirkungen haben könnte.Auch das können Sie selbst sehen:

[continuing from above...]
>> def Object.baz; Object; end
=> nil
>> Object.baz.[TAB]
Display all 1022 possibilities? (y or n)

Wir fügen eine Methode hinzu #baz Zu Object was zurückkommt Object selbst.Dann führen wir eine automatische Vervollständigung durch, um die Methoden zu erhalten, die wir aufrufen können Object.baz.Wenn IRB anruft Object.baz.methods, es würde das Gleiche bekommen wie Object.methods.Stattdessen hat IRB 1022 Vorschläge.Ich bin mir nicht sicher, woher sie kommen, aber es handelt sich eindeutig um eine allgemeine Liste, die nicht wirklich auf dem Kontext basiert.

Der :: Der Operator wird (auch) zum Abrufen der Konstanten eines Moduls verwendet, while . ist nicht.Deshalb HTTP wird in der Vervollständigung für angezeigt Net::, aber nicht für Net.. Net.HTTP ist zwar nicht korrekt, aber Net::HTTP Ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top