Die Ruby_Newbie Guide to Symbole

Hinweis: Alle Materialien in Ruby Revival vorgesehen sind, WIE IST. Durch das Lesen der Materialien in Ruby Revival stimmen Sie alle Risiken bei der Verwendung der beteiligten Materialien zu übernehmen, und Sie stimmen die Autoren, Eigentümer und alle anderen mit Ruby-Revival von jeder Verantwortung für das Ergebnis der missbräuchlichen Nutzung von beteiligten zu entbinden diese Materialien, auch im Fall von Fehlern und / oder Auslassungen in den Materialien. Wenn Sie nicht damit einverstanden sind, müssen Sie diese Materialien nicht lesen.

Zum 99,9% von Ihnen ehrliche Leser, die für Ihre eigenen Handlungen die Verantwortung übernehmen, bin ich wirklich traurig ist es notwendig, alle Leser der obigen Haftungsausschluss zu unterziehen.
INHALT

Real Ruby-Veteranen verstehen Symbole intuitiv, so dass sie diese Dokumentation nicht benötigen. Tatsächlich könnte ein Ruby-Veteran in der Dokumentation suchen Sie gerade lesen und es ungenau nennen, weil die in dieser Dokumentation eingeführt Konzepte nicht die tatsächliche Umsetzung von Symbolen Rubin entsprechen. Dieses Dokument erhebt keinen Anspruch auf die Ruby-Implementierung von Symbolen zu erklären, sondern erklärt, wie ein Anwendungsprogrammierer von ihnen denken kann und nutzt sie, um die gewünschten Ergebnisse zu erzielen, sowie Code enthält Symbole zu lesen.

Symbole können auf vielen Ebenen betrachtet werden:
  • Was Symbole aussehen?
  • Was ähneln sie in anderen Sprachen?
  • Wie werden die Symbole umgesetzt?
  • Was sind Symbole?
  • Was sind die Symbole, nicht wahr?
  • Was kann Symbole für Sie tun?
  • Was sind die Vorteile von Symbolen?
Einige dieser Ebenen sind in diesem Dokument erklärt, und einige sind nicht erforderlich Verwendung von Symbolen zu korrigieren. Weiter lesen.

Dies ist der einzige Bereich, in dem sich alle einig. Die meisten Symbole sieht aus wie ein von einem Nicht-String in Anführungszeichen gefolgt Doppelpunkt:
Eine andere Möglichkeit, ein Symbol zu machen, ist mit einem Doppelpunkt durch eine Zeichenfolge in Anführungszeichen gefolgt, das ist, wie Sie ein Symbol, dessen String-Darstellung machen Leerzeichen enthält:
Die vorhergehende ist auch ein Symbol. Seine String-Darstellung ist:


Wenn Anführungszeichen in einem Symbol verwenden, können Sie entweder einzelne oder doublequotes, solange der Anfang und das Ende Anführungszeichen sind vom gleichen Typ verwenden. Einzel- oder Doppelzimmer, sind die Zeichenfolge und numerische Darstellungen identisch, und die object_id ist das gleiche.

Die Symbole sind unveränderlich. Ihr Wert bleibt während der gesamten Programms konstant. Sie erscheinen nie auf der linken Seite einer Zuweisung. Sie werden nie sehen:
Wenn Sie das versuchen würden, würden Sie die folgende Fehlermeldung erhalten:


Symbole sind wie folgt verwendet:
Oder dieses:
Oder dieses:
Oder dieses:
Jetzt wissen Sie zumindest, was wir reden. Natürlich haben Sie immer noch viele offene Fragen. Weiter lesen.

Ich bin nicht diese Frage zu beantworten qualifiziert. Auf lange Sicht, es spielt keine Rolle. Der Versuch, diese Frage zu Beginn Ihrer Ruby-Karriere zu beantworten, die Frage verwirren.

Die einzige wirklich verbindliche Antwort auf diese Frage ist die C-Code zu lesen, aus denen Rubin (eigentlich der Rubin ausführbare) gebaut wird. Wenn Sie jedoch nach Ruby neu sind, oder eine Person, die sich Ruby verwendet, weil er es mag, aber muss nicht eine Linie Ruby-Autorität sein, ist dies eine Antwort, die Sie zu diesem Zeitpunkt nicht brauchen, und es ist wahrscheinlich am besten für die vorerst alle Diskussionen, wie Symbole in Ruby implementiert sind zu ignorieren.

Es ist eine Zeichenfolge. Nein, es ist ein Objekt. Nein, es ist ein Name.

Es gibt Elemente der Wahrheit in jedem der vorangegangenen Behauptungen, und doch meiner Meinung nach sind sie nicht wertvoll, zum Teil, weil sie auf einer tiefen Kenntnis von Ruby hängen ihre Bedeutung zu verstehen. Ich ziehe die Frage zu beantworten, in einer Sprache, unabhängig Weise „was Symbole sind“:

Ein Ruby Symbol ist eine Sache, die sowohl eine Zahl (integer) Darstellung und eine String-Darstellung hat.


In seiner tatsächlichen Implementierung Ruby ist das Symbol nicht entweder einen String oder eine Zahl enthalten - die Zeichenfolge und Nummer werden woanders gehalten. Das ist nicht wichtig für das Verständnis, wie es funktioniert, aber so fühlt sich frei von dem Symbol zu denken, wie mit der Zeichenfolge und Nummer, wenn das ist leichter zu visualisieren. mysymbol.to_i Syntax und die String-Darstellung mit dem: In Ihrem Code können Sie die Zahlendarstellung mit der Ableitung mysymbol.to_s Syntax. In den meisten Fällen ergibt sich ein Symbol, das die String-Darstellung auch ohne die to_s Konvertierung.

Die Stringdarstellung der Zahl ist viel wichtiger als die Zahl Teil. Wie in der Tat ist die Zahl Teil selten verwendet.

Lassen Sie uns weiter untersuchen Code verwendet:


Der vorangehende Code druckt vier Zeilen. Die erste Zeile gibt die String-Darstellung, weil das ist, wie der puts () -Methode wird eingerichtet. Die zweite Zeile ist eine explizite Umwandlung zu bespannen. Die dritte ist eine explizite Umwandlung in Ganzzahl. Die vierte druckt die Art des Symbols. Der vorangehende Code führt die folgende Ausgabe:


Die erste Zeile zeigt die Stringdarstellung des Symbols. Beachten Sie, dass die String-Darstellung auf die Zeichenfolge nach dem Doppelpunkt identisch ist. Die zweite Zeile wandelt zunächst das Symbol in ein String-Objekt to_s. und druckt sie dann. Die Ausgabe ist die gleiche, aber die explizite Umwandlung in String-Objekt bietet einige zusätzliche Funktionen, die Sie könnte (oder auch nicht) benötigen. Dies wird später in diesem Dokument.

Die dritte Zeile zeigt die ganzzahlige Darstellung des Symbols. Es ist eine nicht-bedeutungsvoll und ziemlich viel nicht-nützliche Zahl, die nicht geändert werden können. Die vierte Zeile zeigt, dass das Symbol eine Aufgabe der Symbol-Klasse ist.

Lassen Sie uns jetzt einige Code erforschen, dass der Wert des Symbols beweist nicht zur Laufzeit geändert werden:


Kann nicht die ganze Zahl StrongARM. Natürlich to_i und to_a wurden nie festgelegt werden Methoden gemeint - sie sind Methoden erhalten (eigentlich Konvertierungen sind sie, aber Sie müssen nicht der Ansicht, dass gerade jetzt), aber es ist ziemlich offensichtlich, dass ein Symbol nicht zur Laufzeit geändert werden kann . In der Informatik spricht, dann ist es unveränderlich.

Ein letzter Punkt. In einem einzigen Programm, jedes Auftreten eines gleichnamigen Symbol eigentlich das gleiche Objekt. Das ist nicht wahr von Strings. Schau dir das an:


Wie Sie sehen können, beide Male: myvalue verwendet wurde, es hatte die gleiche Objekt-ID. Wie Sie sehen können, erzeugt die Objekt-IDs von zwei Verwendungen von „myvalue“ zwei verschiedene Objekt-IDs. Dies ist, wie Symbole Speicher speichern können.

Basierend auf, was in diesem Abschnitt dargestellt wurde, können wir auf die Sprache unabhängige Antwort auf die Frage hinzu: „Was ist ein Symbol“:
  • Ein Ruby Symbol ist eine Sache, die sowohl eine Zahl (integer) Darstellung und eine String-Darstellung hat.
  • Die Stringdarstellung ist viel wichtiger und viel häufiger verwendet.
  • Der Wert der Zeichenfolge Teil des Ruby Symbol ist der Name des Symbols, abzüglich der führenden Doppelpunkt.
  • Ein Ruby Symbol kann zur Laufzeit nicht geändert werden.
  • Mehrere Verwendungen des gleichen Symbol die gleiche Objekt-ID und dasselbe Objekt sind.
Lassen Sie uns jetzt injizieren nur ein wenig von Ruby spezifische Terminologie. Fast alles, was in Ruby ist ein Objekt, und Symbole sind keine Ausnahme. Sie sind Objekte.

Ein Symbol ist kein String

Ein Ruby Symbol ist kein String. Ruby-String-Objekte haben Methoden wie Kapital zu schlagen. und in der Mitte. Ruby-Symbole haben keine solche Methoden:

Ein Symbol ist nicht (nur) ein Name

Allerdings können Symbole, jede Art von unveränderlicher Zeichenfolge zu halten, verwendet werden. Es könnte als eine Konstante verwendet werden (aber Sie würden wahrscheinlich eine Kennung mit einem Großbuchstaben verwenden, anstatt zu starten. Der Punkt ist, werden Symbole nicht nur Namen beschränkt.

Davon abgesehen, sind Symbole als Name verwendet sehr oft, so dass, obwohl gleich ein Symbol zu einem Namen nicht korrekt ist, sagten Symbole häufig verwendete Namen zu halten, ist eine vernünftige Behauptung.

Ein Symbol ist ein Objekt, aber was macht das?

Kein Zweifel, ein Symbol ist ein Objekt, aber so etwas. Fast alles, was in Ruby ist ein Objekt, so zu sagen ein Symbol ein Objekt ist, sagt nichts über unverwechselbare Symbole.

Ein Symbol ist ein Weg, String-Informationen zu übergeben, immer, dass unter der Annahme:
  1. Die Zeichenfolge muss nicht zur Laufzeit geändert werden.
  2. Der String braucht keine Methoden der Klasse String.
Da ein Symbol mit der .to_s Methode in einen String umgewandelt werden, können Sie einen String mit dem gleichen Wert wie das String-Darstellung des Symbols erstellen, und dann können Sie diese Zeichenfolge nach Belieben verändern und alle String-Methoden verwenden.

Um zu sehen, in vereinfachter Weise, wie attr_writer hat seine „Magie“, lesen Sie in diesem Programm:


In dem vorhergehenden ist Funktion make_me_a_setter eine stark vereinfachte Version von attr_writer. Es ist nicht das Gleichheitszeichen implementieren, so die Setter verwenden Sie das Argument in Klammern setzen müssen, anstatt nach einem Gleichheitszeichen. Es ist nicht durch mehrere Argumente wiederholen, so dass jeder make_me_a_setter nur ein Argument nehmen, weshalb wir es individuell für beide nennen: symboll und „stringg“.

Mit den Setter gemacht, kann der Anwendungsprogrammierer die Setter als example.symboll Zugriff ( „ITS A SYMBOL“). Im Folgenden wird die Ausgabe des Programms:

Wenn Sie ein „string“ (Begriff lose) benötigen, die nicht geändert werden müssen, dann müssen Sie ein Symbol, weil der Wert eines Symbols zur Laufzeit nicht geändert werden kann.

Symbole haben in der Regel Leistungsvorteile. Jedes Symbol wird durch seinen Namen den Programmierer identifiziert (zum Beispiel. MySymbol), aber das Programm kann es durch seine numerische Darstellung identifizieren, was natürlich eine schnellere Lookup.

Wenn zwei Strings verglichen werden, müssen irgendwo in einigen Abstraktionsschicht Zeiger beide Strings gehen, für eine Nichtübereinstimmung suchen. Wenn zwei Ruby-Symbole verglichen werden, wenn ihre numerische Darstellung gleich ist, dann sind die Symbole gleich. Wenn Sie verwenden sind: MySymbol zwanzigmal in Ihrem Programm, jede Nutzung: MySymbol verweist auf genau das gleiche Objekt mit genau der gleichen numerischen Darstellung und genau die gleichen String-Darstellung. Dies kann die Leistung verbessern.

Denn jeder: MySymbol bezieht sich genau ein Objekt und noch „definiert“ (ich den Begriff lose verwenden) eine Zeichenkette, es spart erhebliche Speicher über jedes Mal eine Zeichenkette verwenden, da jeder wahre Zeichenkette Speicher verbraucht, während einmal ein Symbol definiert sind, verbrauchen zusätzliche Verwendungen keinen zusätzlichen Speicher. Also, wenn Sie verwenden die gleiche Zeichenkette Dutzende oder Hunderte von Malen, Ersatzsymbole. Hash-Schlüssel sind ein hervorragendes Beispiel.

Der Urvater aller Vorteile ist auch der Urvater Vorteile: Symbole können nicht zur Laufzeit geändert werden. Wenn Sie brauchen etwas, das absolut positiv konstant bleiben müssen, und doch wollen Sie nicht eine Kennung verwenden, um mit einem Großbuchstaben beginnen (eine Konstante), dann Symbole sind das, was Sie brauchen.

Der große Vorteil von Symbolen ist, dass sie unveränderlich sind (kann zur Laufzeit nicht geändert werden), und manchmal das ist genau das, was Sie wollen.

Manchmal ist das genau das, was Sie nicht wollen. Die meisten Verwendung von Strings erfordert Manipulation - etwas, das man nicht (zumindest direkt) mit Symbolen tun.

Ein weiterer Nachteil von Symbolen ist sie nicht über die reiche Set String-Klasse von Instanzmethoden. Die Instanz-Methode der String-Klasse das Leben leichter machen. Viel einfacher.

Egal, was ihr Verständnis von Symbolen, wissen Ruby-Veteranen, wie sie verwenden, um die gewünschten Ergebnisse zu erzielen. Das Problem ist, Ruby-Neulinge wissen nicht, wie Symbole verwenden, um die gewünschten Ergebnisse zu erhalten, und doch müssen sie hören und versuchen, aus den oft widersprüchlichen Erklärungen von Ruby Veteranen zu lernen. Ruby-Veteranen gründen oft ihre Erklärungen auf Ruby-spezifischen Gewohnheiten, Riffs oder auch interne Implementierungen weiter ihre Erklärungen vom Neuling Ruby distanziert.

Dieses Dokument richtet sich speziell an der Ruby-Neuling. Es nutzt sehr kleine Ruby-spezifische Implementierung in seiner Erklärung von Symbolen. Es ist nicht zu streiten Feinheiten, sondern verleiht die Information der Neuling wirklich, um zu wissen, braucht Symbole zu verwenden, um seine Codierung Ziele zu erreichen, sowie Code enthält Symbole zu lesen.

Die folgenden Aussagen sind praktisch in (oder nicht verwenden) Symbole:
  • Ein Ruby Symbol sieht aus wie ein Doppelpunkt von Zeichen. (: MySymbol)
  • Ein Ruby Symbol ist eine Sache, die sowohl eine Zahl (integer) und einen String hat.
  • Der Wert der Zeichenfolge Teil des Ruby Symbol ist der Name des Symbols, abzüglich der führenden Doppelpunkt.
  • Ein Ruby Symbol kann zur Laufzeit nicht geändert werden.
  • Weder ihre Stringdarstellung noch ihre Integerdarstellung kann zur Laufzeit geändert werden.
  • Ruby Symbole sind nützlich bei der Modifikation verhindert wird.
  • Wie die meisten anderen Dinge in Ruby, ist ein Symbol ein Objekt.
  • Wenn Sie ein Programm entwerfen, können Sie in der Regel eine Zeichenfolge anstelle eines Symbols verwenden.
    • Außer, wenn Sie garantieren müssen, dass die Zeichenfolge nicht geändert wird.
  • Symbolobjekte haben nicht den umfangreichen Satz von Instanzmethoden, die String-Objekte zu tun.
  • Nach der ersten Nutzung: MySymbol alle weiteren useages von: MySymbol keine weiteren Speicher nehmen - sie alle das gleiche Objekt sind.
  • Ruby-Symbole speichern Speicher über eine große Anzahl von identischen Zeichenketten.
  • Ruby-Symbole erhöhen, um zumindest einem gewissen Grad Laufzeitgeschwindigkeit.

In Verbindung stehende Artikel