5

目前我有一个会话变量,当我同时使用session["test"]或时返回相同的值session[:test]。这两个是一样的吗?使用一个比另一个更好吗?

谢谢

4

3 回答 3

5

在标准的 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 中返回相同的值。

于 2012-04-24T23:54:41.507 回答
1

就红宝石字符串和符号而言,它们并不相同。

作为一般规则,您应该使用第二种形式,符号是用来表示某些东西的东西,否则它会是一个字符串。这是一种有效地拥有描述性名称的方法,同时节省了用于多次生成字符串的空间。

这意味着每次引用符号时不会像引用字符串那样创建新实例。该符号只是表示您所描述的值的更好方式。

为了完整起见,我应该提一下,如果您稍后需要表示,可以将符号轻松转换为字符串。

如果你想了解更多,这里有一篇很长的博文它很好地解释了红宝石符号。可以说它们是一种优化。

也就是说,ruby SessionHash 在符号上调用 to_s ,因此您可以在这种情况下使用任何一种,因为无论哪种方式输入都会产生字符串。

于 2012-04-24T23:35:01.603 回答
1

不,它们并不完全相同。它们是完成同一件事的两种方式。

一般来说,在 Ruby 中,符号的主要用途是作为键。符号是:these_things。哈希键是它们的典型用途......

{
  :name => 'Mary',
  :rank => 'Captain'
}

会话密钥通常也是符号。

改用字符串不会有任何伤害,但符号更典型。

于 2012-04-24T23:38:57.113 回答