目前我有一个会话变量,当我同时使用session["test"]
或时返回相同的值session[:test]
。这两个是一样的吗?使用一个比另一个更好吗?
谢谢
在标准的 Ruby Hash 中,它们不一样(字符串与符号)
但是,railsSessionHash
子类在存储键之前调用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 中返回相同的值。
就红宝石字符串和符号而言,它们并不相同。
作为一般规则,您应该使用第二种形式,符号是用来表示某些东西的东西,否则它会是一个字符串。这是一种有效地拥有描述性名称的方法,同时节省了用于多次生成字符串的空间。
这意味着每次引用符号时不会像引用字符串那样创建新实例。该符号只是表示您所描述的值的更好方式。
为了完整起见,我应该提一下,如果您稍后需要表示,可以将符号轻松转换为字符串。
如果你想了解更多,这里有一篇很长的博文,它很好地解释了红宝石符号。可以说它们是一种优化。
也就是说,ruby SessionHash 在符号上调用 to_s ,因此您可以在这种情况下使用任何一种,因为无论哪种方式输入都会产生字符串。
不,它们并不完全相同。它们是完成同一件事的两种方式。
一般来说,在 Ruby 中,符号的主要用途是作为键。符号是:these_things
。哈希键是它们的典型用途......
{
:name => 'Mary',
:rank => 'Captain'
}
会话密钥通常也是符号。
改用字符串不会有任何伤害,但符号更典型。