Warum mussten Ruby-Schöpfer das Konzept von symbols
in der Sprache verwenden?
Nun, sie mussten es nicht unbedingt, sie entschieden sich dafür. Beachten Sie auch, dass Symbol
s streng genommen nicht Teil der Sprache sind, sondern Teil der Kernbibliothek. Sie haben eine Literal-Syntax auf Sprachebene, aber sie funktionieren genauso gut, wenn Sie sie durch Aufrufen erstellen müssten Symbol::new
.
Ich frage aus der Perspektive eines Nicht-Rubin-Programmierers, der versucht, es zu verstehen. Ich habe viele andere Sprachen gelernt und in keiner festgestellt, dass ich angeben muss, ob ich mit Ruby zu tun habe oder nicht symbols
.
Sie haben nicht gesagt, was diese "vielen anderen Sprachen" sind, aber hier ist nur ein kleiner Auszug von Sprachen, die einen Symbol
Datentyp wie Ruby's haben:
Es gibt auch andere Sprachen, die die Funktionen von Symbol
s in einer anderen Form bereitstellen . In Java sind die Funktionen von Ruby's String
beispielsweise in zwei (tatsächlich drei) Typen unterteilt: String
und StringBuilder
/ StringBuffer
. Andererseits werden die Merkmale des Ruby- Symbol
Typs in den Java- String
Typ zusammengefasst: Java String
kann interniert werden , Literalzeichenfolgen und String
s, die das Ergebnis von zur Kompilierungszeit bewerteten konstanten Ausdrücken sind, werden automatisch interniert, dynamisch erzeugte String
s können durch Aufrufen interniert werden die String.intern
Methode. Ein Internierter String
in Java ist genau wie ein Internierter in Symbol
Ruby, wird jedoch nicht als separater Typ implementiert, sondern ist nur ein anderer Status als ein JavaString
kann in sein. (Hinweis: In früheren Ruby-Versionen wurde diese Methode String#to_sym
früher aufgerufen String#intern
und ist heute noch als Legacy-Alias vorhanden.)
Die Hauptfrage könnte lauten: Existiert das Konzept von symbols
in Ruby als Leistungsabsicht über sich selbst und andere Sprachen,
Symbol
s sind in erster Linie ein Datentyp mit spezifischer Semantik . Diese Semantik ermöglicht es auch, einige performante Operationen (z. B. schnelle O (1) -Gleichheitstests) zu implementieren, aber das ist nicht der Hauptzweck.
oder nur etwas, das aufgrund der Art und Weise, wie die Sprache geschrieben ist, existieren muss?
Symbol
s werden in der Ruby-Sprache überhaupt nicht benötigt, ohne sie würde Ruby problemlos funktionieren. Sie sind eine reine Bibliotheksfunktion. Es gibt genau eine Stelle in der Sprache, die mit Symbol
s verknüpft ist : Ein def
Methodendefinitionsausdruck ergibt einen Symbol
Wert, der den Namen der Methode angibt, die definiert wird. Dies ist jedoch eine relativ neue Änderung. Zuvor wurde der Rückgabewert einfach nicht angegeben. Die MRT- nil
Untersuchung ergab lediglich eine Bewertung , Rubinius eine Bewertung für ein Rubinius::CompiledMethod
Objekt und so weiter. Es wäre auch möglich, zu einem UnboundMethod
... oder nur zu einem ... zu bewerten String
.
Wäre ein Programm in Ruby leichter und / oder schneller als das Gegenstück in Python oder Node? Wenn ja, würde es daran liegen symbols
?
Ich bin nicht sicher, was Sie hier fragen. Leistung ist meist eine Frage der Implementierungsqualität, nicht der Sprache. Außerdem ist Node nicht einmal eine Sprache, sondern ein ereignisgesteuertes E / A-Framework für ECMAScript. Durch Ausführen eines entsprechenden Skripts in IronPython und MRI ist IronPython wahrscheinlich schneller. Das Ausführen eines entsprechenden Skripts auf CPython und JRuby + Truffle, JRuby + Truffle ist wahrscheinlich schneller. Dies hat nichts mit Symbol
s zu tun, sondern mit der Qualität der Implementierung: JRuby + Truffle verfügt über einen aggressiv optimierenden Compiler sowie die gesamte Optimierungsmaschinerie einer leistungsstarken JVM. CPython ist ein einfacher Interpreter.
Da es Rubys Absicht ist, für Menschen leicht zu lesen und zu schreiben, könnten die Entwickler den Codierungsprozess nicht dadurch vereinfachen, dass sie diese Verbesserungen im Interpreter selbst implementieren (wie es in anderen Sprachen der Fall sein könnte)?
Nr. Symbol
S sind keine Compiler-Optimierung. Sie sind ein separater Datentyp mit spezifischer Semantik. Sie sind nicht wie die Flonums von YARV , die eine private interne Optimierung für Float
s darstellen. Die Situation ist nicht die gleiche wie für Integer
, Bignum
und Fixnum
, was sein soll , eine unsichtbare private interne Optimierung Detail, aber leider ist es nicht. (Dies wird endlich in Ruby 2.4 behoben, das nur entfernt Fixnum
und Bignum
und verlässt Integer
.)
Wenn Sie dies wie in Java tun, bedeutet dies, String
dass Sie als normaler Zustand immer vorsichtig sein müssen, ob sich Ihre String
s in diesem speziellen Zustand befinden und unter welchen Umständen sie sich automatisch in diesem speziellen Zustand befinden und wann nicht. Das ist eine viel höhere Belastung als ein separater Datentyp.
Gibt es eine sprachunabhängige Definition von Symbolen und einen Grund, sie in anderen Sprachen zu haben?
Symbol
ist ein Datentyp, der das Konzept bezeichnet Namen oder Etikett . Symbol
s sind Wertobjekte , unveränderlich, normalerweise unmittelbar (wenn die Sprache so etwas unterscheidet), staatenlos und haben keine Identität. Zwei Symbol
gleiche sind garantiert auch identisch, dh zwei Symbol
gleiche sind eigentlich dasselbe Symbol
. Dies bedeutet, dass Wertgleichheit und Referenzgleichheit dasselbe sind, und somit ist Gleichheit effizient und O (1).
Die Gründe, sie in einer Sprache zu haben, sind wirklich die gleichen, unabhängig von der Sprache. Einige Sprachen stützen sich mehr auf sie als andere.
In der Lisp-Familie gibt es zum Beispiel kein Konzept von "Variable". Stattdessen haben Sie Symbol
s mit Werten verknüpft.
In Sprachen mit reflektierenden oder introspektiven Fähigkeiten, Symbol
werden s häufig verwendet , um die Namen von reflektiertem Einheiten in dem Reflexions APIs zu bezeichnen, zum Beispiel in Ruby, Object#methods
, Object#singleton_methods
, Object#public_methods
, Object#protected_methods
, und Object#public_methods
eine Rückkehr Array
von Symbol
s (obwohl sie genauso gut könnten eine Rückkehr Array
von Method
s). Object#public_send
Nimmt eine Symbol
Bezeichnung für den Namen der zu sendenden Nachricht als Argument (obwohl auch eine akzeptiert wird String
, Symbol
ist dies semantisch korrekter).
In ECMAScript sind Symbol
s ein grundlegender Baustein, um ECMAScript in Zukunft funktionssicher zu machen. Sie spielen auch eine große Rolle bei der Reflexion.