【问题标题】:Ruby - What is the difference between intern and to_symRuby - 实习生和 to_sym 有什么区别
【发布时间】:2014-08-07 17:40:27
【问题描述】:

我遇到了 Ruby 字符串文档并测试了这些方法。我发现两个相似的方法是 to_sym 和 intern 方法。

"cat".intern
=> :cat

"cat".to_sym
=> :cat

我搜索了 Stack Overflow,但令人惊讶的是,没有人问过这个问题。我自己找不到两者之间的区别,所以我想我会问这个。

如果他们做同样的事情,一种方法比另一种更快吗?如果是这样,使用该方法是有意义的。

【问题讨论】:

  • to_sym 只是intern 的别名,后者是在时间中创建的。

标签: ruby methods symbols


【解决方案1】:

Rubocop 在其中一个 linter cops 中使用此比较作为示例:Style/StringMethods 通过此 cop 的默认设置,to_sym 优于 intern,没有任何样式指南或进一步文档的参考。我个人的观察是,选择仅仅是因为可读性;鉴于性能不是其他答案中所述的问题。

【讨论】:

    【解决方案2】:

    它们似乎是同一事物的别名。从documentation可以看出intern的示例代码使用了to_sym

    实习生→符号

    返回对应于str的符号,如果是则创建符号 以前不存在。见Symbol#id2name

    "Koala".intern         #=> :Koala
    s = 'cat'.to_sym       #=> :cat
    s == :cat              #=> true
    s = '@cat'.to_sym      #=> :@cat
    s == :@cat             #=> true
    

    这也可以用来创建无法表示的符号 使用 :xxx 符号。

    'cat and dog'.to_sym   #=> :"cat and dog"
    

    【讨论】:

    • 如果你展开他们的源码视图,他们都会列出rb_str_intern()的定义。
    • 正如预期的那样,看起来没有区别。在那种情况下,一种方法在性能方面更快吗?如果是这样,那将是正确的使用方法
    • @user3713082 它们不是相互竞争的定义。他们只是别名。因此,性能应该没有任何差异。
    • 那是非常糟糕的示例代码。他们为什么会给你展示 to_sym 的例子,而不是使用实际的别名而不指出它是一个别名。 sigh 我在文档中看到了很多,示例中没有使用实际方法,我不明白为什么它一直在发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2010-09-06
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多