Crystal语言:使用什么而不是运行时String :: to_sym

jsa*_*aak 5 string-to-symbol crystal-lang

我试图将红宝石程序转换为水晶.

而我却被遗忘了 string.to_sym

我有一个大的xml文件,它太大而不适合内存.所以解析它是不可能的.幸运的是,我不需要所有信息,只需要一部分信息.所以我自己解析它,删除大部分行.我以前用来String::to_sym存储数据,如下所示:

:param_name1 => 1
:param_name2 => 11
:param_name1 => 2
:param_name2 => 22
:param_name1 => 3
:param_name2 => 33
Run Code Online (Sandbox Code Playgroud)

我应该在水晶中使用什么?记忆是瓶颈.我不想param_name1多次存储.

Jon*_*Haß 7

如果您有一个已知的参数列表,您可以使用枚举:

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
Run Code Online (Sandbox Code Playgroud)

如果参数列表未知,则可以使用效率较低的参数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
Run Code Online (Sandbox Code Playgroud)