我在Ruby on Rails 4.0中了解到Rails能够通过一个键引用散列值,键可以是符号或字符串,使用类HashWithIndifferentAccess
,例如,params
散列可以通过符号或字符串引用,因为它使用类HashWithIndifferentAccess
。
即:params["id"] and params[:id] --> both access the id in the params hash
虽然这两种方法都可以被Rails使用和接受,但是从最佳实践/性能的Angular 来看,是否有一种方法比其他方法更好呢?我最初的想法是使用符号会更好,因为一旦存储了符号,它们就会保留那块内存。这与字符串形成了对比,每个字符串都需要一个新的内存。
这是正确的吗?或者使用字符串还是符号真的不重要吗?
2条答案
按热度按时间vyswwuz21#
Ruby字符串是可变的,这可能会带来一些不可预测性,并降低性能。由于这些原因,Ruby还提供了符号的选择。最大的区别是符号是不可变的。可变对象可以更改,而不可变对象只能被覆盖。符号更好地利用内存,从而提高性能,但如果不够小心,应用的内存占用将增加。
使用字符串或符号可以归结为理解这两个术语,以及它们将如何服务于应用的整体健康和性能。这就是为什么可能没有严格定义在哪里使用字符串和符号的原因。
我可能会给予什么作为建议的指导,其中:
HashWithIndifferentAccess
最终在内部将所有符号Map到字符串。如果您尝试检索创建的散列(h)的键,则会获得字符串形式的键
pgvzfuti2#
几个亮点:
首先,从Ruby 2.3开始,字符串不变性(具有相同内容的对象指向内存中的相同位置)是一个选项。据我所知,这个功能将成为Ruby 3.0的默认设置。下面是一个示例:
运行文件:
第二,符号通常被首选为哈希键(参见这篇流行的样式指南)。
如果你有兴趣了解更多关于
HashWithIndifferentAccess
的工作原理,here's a good blog post.简短的版本是所有的键都在幕后转换成字符串。