为什么没有更多项目使用Ruby符号而不是字符串?

时间:2010-03-10 09:34:45

标签: ruby symbols

当我第一次开始阅读和学习ruby时,我读到了关于字符串上ruby符号的强大功能:符号只存储在内存中一次,而字符串每个字符串存储在内存中一次,即使它们是相同的。

例如:控制器中的Rails'params哈希有一堆键作为符号:

params[:id] or
params[:title]...

但是Sinatra和Jekyll等其他大小合适的项目并不这样做:

化身:

post.data["title"] or
post.data["tags"]...

屈:

params["id"] or
params["title"]...

这使得阅读新代码变得有点棘手,并且难以传输代码并弄清楚为什么使用符号不起作用。还有更多这方面的例子,这有点令人困惑。我们是否应该在这种情况下使用符号?符号有什么优点,我们应该在这里使用吗?

4 个答案:

答案 0 :(得分:4)

在ruby中,创建AST后,每个符号都表示为唯一的整数。将符号作为哈希键使得计算速度更快,因为主要操作是比较。

答案 1 :(得分:4)

符号不是垃圾收集AFAIK,因此可能需要注意,但除此之外,它们确实很好用作哈希键。

答案 2 :(得分:0)

使用字符串的一个原因可能是使用yaml来定义值。

require 'yaml'
data = YAML.load(<<-data
    one:
      title: one
      tag: 1
    two:
      title: two
      tag: 2
  data
  )  #-> {"one"=>{"title"=>"one", "tag"=>1}, "two"=>{"title"=>"two", "tag"=>2}}

您可以使用yaml定义符号键:

require 'yaml'
data = YAML.load(<<-data
    :one:
      :title: one
      :tag: 1
    :two:
      :title: two
      :tag: 2
  data
  ) #-> {:one=>{:title=>"one", :tag=>1}, :two=>{:title=>"two", :tag=>2}}

但是在yaml-definition中,符号看起来有点奇怪,字符串看起来更自然。

字符串作为键的另一个原因:根据用例,按键排序是合理的,但您不能对符号进行排序(至少在没有转换为字符串的情况下)。

答案 3 :(得分:-1)

主要区别在于表示单个值的多个符号是相同的,而字符串则不然。例如:

irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618

3符号引用:test,所有相同的对象。

irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948

3对字符串&#34; test&#34;的引用,所有不同的对象。

这意味着使用符号可能会节省大量内存,具体取决于应用程序。比较符号的速度也更快,因为它们是同一个对象,比较相同的字符串要慢得多,因为需要比较字符串值而不仅仅是对象ID。

我通常使用字符串几乎所有东西,除了散列键之类的东西,我真的想要一个唯一的标识符,而不是字符串