【问题标题】:Why don't more projects use Ruby Symbols instead of Strings?为什么没有更多的项目使用 Ruby 符号而不是字符串?
【发布时间】:2011-01-25 19:48:06
【问题描述】:

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

例如:Rails 的 paramsController 中的 Hash 有一堆键作为符号:

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

但 Sinatra 和 Jekyll 等其他体面大小的项目并没有这样做:

杰基尔:

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

辛纳屈:

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

这使得阅读新代码变得有点棘手,并且难以转移代码并找出使用符号不起作用的原因。还有很多这样的例子,这有点令人困惑。在这种情况下我们应该还是不应该使用符号?符号的优点是什么,我们应该在这里使用它们吗?

【问题讨论】:

    标签: ruby symbols


    【解决方案1】:

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

    【讨论】:

    • 所以这些项目没有实现这个的原因一定是因为这不是常识,我想不出别的。
    • 考虑到ruby代码“rest”的速度,sym优化有点没有意义,所以情况不是缺乏知识,而是个人喜好。 rails 更多地使用它来美观,输入 :x 比输入 "x" 更好
    • 大声笑,它更好。但如果某些东西更优化,我认为我们应该使用它,特别是如果它更有趣的话。
    【解决方案2】:

    符号不是垃圾收集的 AFAIK,所以这可能是一件需要注意的事情,但除了它们确实非常适合作为哈希键。

    【讨论】:

    • 内部 Ruby 符号存储为整数,因此它们与平台上的整数一样大。除此之外 - 也像整数文字一样 - 它们是唯一的(从来没有两个 1 或 :foo 对象),所以我不会太担心 GC。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      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。

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

      【讨论】:

      • 这如何回答这个问题?这不是“字符串和符号有什么区别”或“我在哪里使用符号”
      • 此外,即使在您的回答中,您也有点自相矛盾。你描述了符号的伟大之处,然后说你更喜欢在任何地方使用字符串。
      • 是的,我仍然说符号更好用,但这取决于我在最后一行中提到的用例/要求。
      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2020-06-02
      • 2014-06-27
      • 2013-05-13
      • 1970-01-01
      相关资源
      最近更新 更多