如果存在符号,为什么甚至在哈希中使用字符串

时间:2017-01-06 23:50:42

标签: ruby

如果使用符号,为什么我会使用字符串1)节省内存2)具有更好的访问时间

我看到了有时会使用字符串的代码,有时会使用符号。为什么你会选择具有符号所有优点的字符串?

好的,您的访问键通常不是字符串,因此您始终可以键入转换。但是,为什么铸造不是隐含发生的呢?

2 个答案:

答案 0 :(得分:3)

  

我看到了有时会使用字符串的代码,有时会使用符号。为什么你会选择具有符号所有优点的字符串?

在Ruby 2.2中添加Symbol GC之前,在运行时生成符号会导致长时间运行的应用程序出现内存泄漏。使用字符串是一种绕过这个内存问题并获得gc的方法,它会在ruby生态系统中徘徊。对于冻结字符串支持,在某些时候符号和字符串将是相同的。

  

好的,您的访问键通常不会成为字符串,因此您始终可以键入转换。但是,为什么铸造不是隐含发生的呢?

哈希将对象映射到对象。这样:

{"a"=>1, :a=>1}

是有效的哈希。

如果您想隐式投射,可以使用ActiveSupport中的HashWithIndifferentAccess

答案 1 :(得分:2)

有不同的权衡,

  • 符号最适用于有限的一组键,这些键理想地限于源代码中的值。
  • 字符串最适用于从用户输入或其他外部源获取的无限组密钥,例如处理非结构化JSON数据时。

为什么?

在Ruby 2.2符号没有被垃圾收集之前,处理无限制的密钥集显然会导致内存泄漏。但即使有车库收藏,仍然需要付出很大的代价才能实现"实习生"所有字符串输入将它们变成符号。因此,如果您的代码消耗文本文件或网络中的字符串,那么只使用字符串键是最明智的。