我正在尝试手动创建一些参数传递给Rails控制器函数,为什么用冒号列出的params散列的键,例如params[:key]
而非params["key"]
?
答案 0 :(得分:16)
Rails使用ActiveSupport’s HashWithIndifferentAccess
几乎所有来自内部的哈希值,例如params
。除了符号或相同“值”的字符串的键访问返回相同的哈希值之外,HashWithIndifferentAccess
的行为与常规哈希相同。例如:
h = HashWithIndifferentAccess.new
h[:foo] = 'bar'
h[:foo] #=> "bar"
h['foo'] #=> "bar"
h['foo'] = 'BAR'
h[:foo] #=> "BAR"
VS。普通哈希:
h = {}
h[:foo] = 'bar'
h[:foo] #=> "bar"
h['foo'] #=> nil
h['foo'] = 'BAR'
h[:foo] #=> "bar"
这使您不必担心(无论好坏)关于特定键是符号还是字符串。
答案 1 :(得分:0)
哈希使用符号作为键,因为每个符号始终只有一个实例,这使搜索更容易。当使用字符串时,必须计算散列,因为它不能是相同的字符串(另一个实例,但具有相同的内容)。所以它使它更快。有效支持HashWithIndifferentAccess
会使用#to_sym
方法将所有字符串强制转换为符号。
答案 2 :(得分:0)
在大多数情况下,字符串(带引号)和符号(带冒号)在Rails中作为哈希键交换。当哈希键是预定义的常量时,它们的符号是惯用的。 Ruby 1.9具有语法糖,用于编写具有键符号的哈希。