Ich versuche, ein Ruby-Programm in Kristall zu konvertieren.Crystal Sprache: Was zu verwenden, anstelle der Laufzeit String :: to_sym
Und ich steckte mit fehlenden string.to_sym
Ich habe eine GROSSEN XML-Datei, die zu groß ist, in dem Speicher zu passen. So Parsing alles ist nicht in Frage. Zum Glück brauche ich nicht alle Informationen, nur einen Teil davon. Also analysiere ich es selbst und lasse die meisten Zeilen fallen. Ich benutzte String::to_sym
die Daten zu speichern, wie folgt aus:
:param_name1 => 1
:param_name2 => 11
:param_name1 => 2
:param_name2 => 22
:param_name1 => 3
:param_name2 => 33
Was soll ich in Kristall verwenden? Speicher ist der Flaschenhals. Ich möchte param_name1
nicht mehrfach speichern.
Ich bin ein bisschen verwirrt, also zur kompilierungszeit hat kristall unveränderliche strings und symbole, aber ich sehe den unterschied zwischen den beiden nicht. Und es gibt Enums auch. Und nur Enums können zur Laufzeit verwendet werden (indem der Int32 von einem Namen abgerufen wird). Und StringPool ist ein Laufzeitäquivalent von Symbol? – jsaak
Symbole werden zur Kompilierzeit in eine eindeutige Nummer übersetzt, so dass ihre Speicherrepräsentation eine einzelne Zahl ist. Daher können Sie sie nicht dynamisch erstellen, die Werte werden zur Kompilierzeit nicht deterministisch zugewiesen und die Tabelle kann zur Laufzeit nicht erweitert werden. –
Zeichenketten sind unveränderlich, aber mit ihren vollständigen Daten im Speicher, so dass Sie Operationen auf ihren tatsächlichen Zeichenfolgenwert ausführen können, Symbole, die Sie zuerst in ihren Zeichenfolgenwert konvertieren müssen, um dies zu tun. StringPool ist lediglich eine Convenience-API für einen Lookup-Hash/Set, der Instanzen dedupliziert. –