为什么不';有更多的项目使用Ruby符号而不是字符串吗?

为什么不';有更多的项目使用Ruby符号而不是字符串吗?,ruby,symbols,Ruby,Symbols,当我第一次开始阅读和学习ruby时,我读到了ruby符号对字符串的影响:符号只存储在内存中一次,而字符串每个字符串存储在内存中一次,即使它们是相同的 例如:控制器中的Rails'paramsHash有一组键作为符号: params[:id] or params[:title]... 但其他规模适中的项目,如Sinatra和Jekyll,却没有做到这一点: 杰基尔: post.data["title"] or post.data["tags"]... 西纳特拉: params["id"] or

当我第一次开始阅读和学习ruby时,我读到了ruby符号对字符串的影响:符号只存储在内存中一次,而字符串每个字符串存储在内存中一次,即使它们是相同的

例如:控制器中的Rails'
params
Hash有一组键作为符号:

params[:id] or
params[:title]...
但其他规模适中的项目,如Sinatra和Jekyll,却没有做到这一点:

杰基尔:

post.data["title"] or
post.data["tags"]...
西纳特拉:

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

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

在ruby中,创建后,每个符号都表示为一个唯一的整数。将符号作为散列键可以大大加快计算速度,因为主要操作是比较。

符号不是垃圾收集的,因此这可能是一件需要注意的事情,但它们确实非常适合作为散列键。

使用字符串的一个原因可能是使用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”
data=YAML.load({“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”
data=YAML.load({:title=>one',:tag=>1},:two=>{:title=>two',:tag=>2}}
但是在yaml定义中,符号看起来有点奇怪,字符串看起来更自然


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

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

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对符号的引用:测试,所有相同的对象

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


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

,所以这些项目没有实现这一点的原因一定是因为这不是常识,我想不出其他任何东西。考虑到“rest”的速度在ruby代码中,sym优化是毫无意义的,因此情况不是缺少知识,而是个人偏好。rails使用它更多的是为了美观,更好地键入:x而不是“x”lol,它更好。但是如果某个东西更优化,我认为我们应该使用它,特别是如果编写起来更有趣的话。内部Ruby符号存储为整数,因此它们与平台上的整数一样大。除此之外,它们也是唯一的(从来没有两个1或:foo对象),所以我不会太担心GC。这是如何回答问题的?不是“字符串和符号之间的区别”或“我在哪里使用符号”此外,即使在你的回答中,你也有点自相矛盾。你描述了符号有多伟大,然后说你更喜欢在任何地方使用字符串。是的,我仍然说符号更适合使用,但这取决于我在最后一行中提到的用例/要求。