Próbuję przekonwertować program ruby na kryształ.Język Crystal: co używać zamiast runtime String :: to_sym
i jestem skazany brakuje string.to_sym
Mam duży plik XML, który jest zbyt duży, aby zmieścić się w pamięci. A więc przeanalizowanie tego wszystkiego nie wchodzi w grę. Na szczęście nie potrzebuję wszystkich informacji, tylko ich część. Więc sam je parsuję, upuszczając większość linii. Kiedyś String::to_sym
do przechowywania danych, takich jak to:
:param_name1 => 1
:param_name2 => 11
:param_name1 => 2
:param_name2 => 22
:param_name1 => 3
:param_name2 => 33
Co należy użyć w krysztale? Pamięć jest wąskim gardłem. Nie chcę wielokrotnie przechowywać param_name1
.
jestem trochę zdezorientowany, więc przy kompilacji kryształ ma niezmienne łańcuchy i symbole, ale nie widzę różnicy między nimi. A także Enums. I tylko Enums są użyteczne w czasie wykonywania (pobieranie int32 z nazwy). And StringPool jest ekwiwalentem runtime dla Symbol? – jsaak
Symbole są tłumaczone na unikalny numer podczas kompilacji, więc ich reprezentacja pamięci jest pojedynczym numerem. Dlatego nie można ich tworzyć dynamicznie, wartości są przypisywane niedeterministycznie w czasie kompilacji, a tabela nie może być rozszerzona w czasie wykonywania. –
Ciągi są niezmienne, ale z pełnymi danymi w pamięci, dzięki czemu można wykonywać operacje na ich rzeczywistej wartości ciągu, symbole, które trzeba najpierw przekonwertować na wartość ciągu znaków. StringPool jest po prostu wygodnym API podczas wyszukiwania Hash/Set, który deduplikuje instancje. –