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

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

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

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

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

杰奇:

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

西纳特拉:

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

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

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

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

使用字符串的一个原因可能是使用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符号中看起来有点奇怪,字符串看起来更自然。

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

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

 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引用字符串“test”,所有不同的对象。

这意味着使用符号可以根据应用程序节省大量内存。 比较符号的速度也比较快,因为它们是同一个对象,比较相同的字符串要慢得多,因为需要比较字符串值而不仅仅是对象id。

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