2015-09-12 2 views
5

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.

Antwort

6

Wenn Sie eine bekannte Liste von Parametern haben Sie zum Beispiel können eine ENUM verwenden:

enum Parameter 
    Name1 
    Name2 
    Name3 
end 

a = "Name1" 
b = {'N', 'a', 'm', 'e', '1'}.join 
pp a.object_id == b.object_id # => false 
pp Parameter.parse(a) == Parameter.parse(b) # => true 

Wenn die Liste der Parameter unbekannt ist, können Sie die weniger verwenden effiziente StringPool:

require "string_pool" 

pool = StringPool.new 

a = "param1" 
b = {'p', 'a', 'r', 'a', 'm', '1'}.join 

pp a.object_id == b.object_id # => false 
a = pool.get(a) 
b = pool.get(b) 
pp a.object_id == b.object_id # => true 
+0

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

+0

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. –

+0

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. –

Verwandte Themen