当我第一次开始阅读和学习ruby时,我读到了关于字符串上ruby符号的强大功能:符号只存储在内存中一次,而字符串每个字符串存储在内存中一次,即使它们是相同的。
例如:控制器中的Rails'params
哈希有一堆键作为符号:
params[:id] or
params[:title]...
但是Sinatra和Jekyll等其他大小合适的项目并不这样做:
化身:
post.data["title"] or
post.data["tags"]...
屈:
params["id"] or
params["title"]...
这使得阅读新代码变得有点棘手,并且难以传输代码并弄清楚为什么使用符号不起作用。还有更多这方面的例子,这有点令人困惑。我们是否应该在这种情况下使用符号?符号有什么优点,我们应该在这里使用吗?
答案 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。
我通常使用字符串几乎所有东西,除了散列键之类的东西,我真的想要一个唯一的标识符,而不是字符串