我应该在Ruby on Rails中使用引号或冒号作为会话密钥吗?

时间:2012-04-24 23:28:34

标签: ruby-on-rails

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

由于

3 个答案:

答案 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'
}

会话密钥通常也是符号。

使用字符串不会伤害任何东西,但符号更典型。