目前我有一个会话变量,当我同时使用session["test"]
或session[:test]
时会返回相同的值。这两个是一样的吗?使用一个比另一个好吗?
由于
答案 0 :(得分:5)
在标准的Ruby Hash中,它们不相同(string vs symbol)
但是,rails SessionHash
子类在存储它们之前会调用键上的to_s
,因此所有键都存储为字符串(即使您指定了符号):
class SessionHash < Hash
def [](key)
load_for_read!
super(key.to_s)
end
def []=(key, value)
load_for_write!
super(key.to_s, value)
end
这就是session[:test]
和session["test"]
在rails中返回相同值的原因。
答案 1 :(得分:1)
就红宝石字符串和符号而言,它们并不相同。
作为一般规则,您应该使用第二种形式,符号是用于表示本来是字符串的东西的东西。这是一种有效地具有描述性名称的方法,同时节省了用于多次生成字符串的空间。
这意味着每次引用符号时都不会像创建字符串那样创建新实例。符号只是表示您所描述的值的更好方式。
为了完整起见,我应该提一下如果以后需要表示,可以将符号简单地转换为字符串。
如果你想阅读更多内容,有一篇冗长的博客文章just here可以很好地解释ruby符号。可以说它们是一种优化。
那说ruby SessionHash在符号上调用to_s,所以你可以在这种情况下使用任何一种方式作为字符串的输入。
答案 2 :(得分:1)
通常,在Ruby中,符号的主要用途是键。符号为:these_things
。哈希键是他们的典型用途......
{
:name => 'Mary',
:rank => 'Captain'
}
会话密钥通常也是符号。
使用字符串不会伤害任何东西,但符号更典型。