【问题标题】:Can't get the hang of symbols in Ruby无法掌握 Ruby 中的符号
【发布时间】:2011-10-07 05:15:50
【问题描述】:

过去几天我一直在研究如何理解 Ruby 中的符号。我阅读了谷歌上关于 Ruby 符号的每一篇文章,其中大部分都是不好的解释,所以我来到这里,我看到一些关于这个主题的问题,但是我不明白,对不起。

根据我的阅读,我了解到符号是不可变且唯一的,因此内存消耗和性能优于常规字符串。

问题 #1
符号在生活中的目的是为了服务于与弦乐相同的利基吗?符号的目的是作为方便的常量而不带值,就像 : 之后的部分一样,它是实际值吗?

问题 #2
我什么时候真正知道在哪里使用符号?

我非常感谢您自己对符号的解释,而不是链接到 Google 上的文章(我确保我已经阅读过它!)。

如果您能提供比我已经在这里询问的更多的符号信息,我也非常感谢您的时间,因为我根本不理解它们,甚至不理解存储在 :symbol_something 中的内容,它是参考还是什么?

非常感谢您的帮助!

【问题讨论】:

标签: ruby symbols


【解决方案1】:

ruby 中的符号是一种有效利用不可变字符串的方法。例如,假设您想使用字符串“my_key”作为哈希键。简单地使用字符串既浪费空间又浪费效率,因为每次指定哈希键“my_key”时,即使字符串值内容相同,您也在不同的内存位置创建不同的字符串实例!所以如果你有 100 个 my_hash['my_key'] 实例,你就有 100 个字符串 'my_key' 的实例。符号 :my_key 并非如此。 :my_key 无论您使用多少次,都只有一个实例!

您应该在通常使用不可变字符串作为标识符的地方使用符号。

【讨论】:

  • 谢谢,真的这么简单吗?
  • @Frank Zimmer:基本上。符号不是任何一种深奥的魔法。符号的好处更多在于“为什么”而不是“如何”。当您看到一个字符串时,您需要想知道它是作为文本还是作为特殊标记(如果您将字符串 low 作为函数的参数,是告诉函数某些内容应该包含全小写字符串“低”,或者它应该具有低优先级?)。 Ruby 中的字符串用于第一种情况,符号用于第二种情况。
  • @Chuck:很好的解释,你应该给它一个答案。
【解决方案2】:

理解这一点的方法是考虑到 String 是一个 Ruby 对象,它没有被指定为不可变的。因此,语言处理器无法进行许多优化,代码的读者可能会也可能不会理解给定的字符串是用作可变数据结构还是用作某些东西的键。

但是符号不可变的,所以它们有唯一的实例。它们也很容易键入,并且符号的使用清楚地表明 “标识符”“令牌” 以供以后阅读代码的任何人使用。

最后,Symbol 类实现了显式转换#to_s,,因此符号可以安全地用于您知道#to_s 将被调用的表达式中,例如ERB templates 或I/O操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多