ruby-on-rails 使用HashWithIndifferentAccess时字符串与符号?

erhoui1w  于 2023-02-26  发布在  Ruby
关注(0)|答案(2)|浏览(163)

我在Ruby on Rails 4.0中了解到Rails能够通过一个键引用散列值,键可以是符号或字符串,使用类HashWithIndifferentAccess,例如,params散列可以通过符号或字符串引用,因为它使用类HashWithIndifferentAccess
即:params["id"] and params[:id] --> both access the id in the params hash
虽然这两种方法都可以被Rails使用和接受,但是从最佳实践/性能的Angular 来看,是否有一种方法比其他方法更好呢?我最初的想法是使用符号会更好,因为一旦存储了符号,它们就会保留那块内存。这与字符串形成了对比,每个字符串都需要一个新的内存。
这是正确的吗?或者使用字符串还是符号真的不重要吗?

vyswwuz2

vyswwuz21#

Ruby字符串是可变的,这可能会带来一些不可预测性,并降低性能。由于这些原因,Ruby还提供了符号的选择。最大的区别是符号是不可变的。可变对象可以更改,而不可变对象只能被覆盖。符号更好地利用内存,从而提高性能,但如果不够小心,应用的内存占用将增加。
使用字符串或符号可以归结为理解这两个术语,以及它们将如何服务于应用的整体健康和性能。这就是为什么可能没有严格定义在哪里使用字符串和符号的原因。
我可能会给予什么作为建议的指导,其中:

  • 符号-内部标识符,不打算更改的变量
  • 字符串-正在更改或打印输出的变量

HashWithIndifferentAccess最终在内部将所有符号Map到字符串。

h = ActiveSupport::HashWithIndifferentAccess.new(test: 'test')

如果您尝试检索创建的散列(h)的键,则会获得字符串形式的键

h.keys # => ["test"]
pgvzfuti

pgvzfuti2#

几个亮点:
首先,从Ruby 2.3开始,字符串不变性(具有相同内容的对象指向内存中的相同位置)是一个选项。据我所知,这个功能将成为Ruby 3.0的默认设置。下面是一个示例:

# frozen_string_literal: true

a = 'foo'
b = 'foo'

puts a.object_id
puts b.object_id

puts a.equal?(b)

运行文件:

➜  ruby test.rb  
70186103229600  
70186103229600  
true

第二,符号通常被首选为哈希键(参见这篇流行的样式指南)。
如果你有兴趣了解更多关于HashWithIndifferentAccess的工作原理,here's a good blog post.简短的版本是所有的键都在幕后转换成字符串。

相关问题