5

我正在尝试手动创建一些参数以传递给 Rails 控制器函数,为什么参数哈希的键用冒号列出,例如params[:key]而不是params["key"]

4

3 回答 3

16

Rails对几乎所有来自其内部的哈希使用 ActiveSupportHashWithIndifferentAccess,例如params. A 的HashWithIndifferentAccess行为与常规哈希相同,只是通过相同“值”的符号或字符串的键访问返回相同的哈希值。例如:

h = HashWithIndifferentAccess.new
h[:foo] = 'bar'
h[:foo]  #=> "bar"
h['foo'] #=> "bar"

h['foo'] = 'BAR'
h[:foo]  #=> "BAR"

与普通哈希相比:

h = {}
h[:foo] = 'bar'
h[:foo]  #=> "bar"
h['foo'] #=> nil

h['foo'] = 'BAR'
h[:foo]  #=> "bar"

这使您不必担心(无论好坏)特定键是符号还是字符串。

于 2013-01-27T21:31:03.133 回答
0

哈希使用符号作为键,因为每个符号总是只有一个实例,这使得搜索更容易。使用字符串时,必须计算哈希值,因为它不能是相同的字符串(另一个实例,但具有相同的内容)。所以它使它更快。主动支持HashWithIndifferentAccess将使用方法将所有字符串转换为符号#to_sym

于 2013-01-27T21:33:11.553 回答
0

在大多数情况下,字符串(带引号)和符号(带冒号)在 Rails 中作为哈希键互换。当哈希键是预定义的常量时,它们是惯用的。Ruby 1.9 具有用于编写带有键符号的哈希的语法糖。

于 2013-01-27T21:44:46.360 回答