符号表上的维基百科条目是一个很好的参考:
http://en.wikipedia.org/wiki/Symbol_table
但是当我尝试理解 Ruby 中的符号以及它们在符号数组中的表示方式(由Symbol.all_symbols
方法返回)时,
我想知道 Ruby 的符号表方法与其他语言是否有任何重要区别?
符号表上的维基百科条目是一个很好的参考:
http://en.wikipedia.org/wiki/Symbol_table
但是当我尝试理解 Ruby 中的符号以及它们在符号数组中的表示方式(由Symbol.all_symbols
方法返回)时,
我想知道 Ruby 的符号表方法与其他语言是否有任何重要区别?
从这个意义上说,Ruby 并没有真正的“符号表”。它有绑定和符号(lispers 称之为atom),但它并没有真正按照文章描述的方式进行操作。
因此,在回答您的问题时:ruby 并没有以不同的方式完成相同的事情,而是它做了两个不同的事情(:xxx
符号-> 范围内的唯一 ID 和绑定)并为它们使用相似/重叠的术语.
澄清:
您链接到的文章给出了符号表的常规定义,即
其中程序源代码中的每个标识符都与与其在源代码中的声明或外观相关的信息相关联,例如它的类型、范围级别,有时还有它的位置
但这不是 ruby 的符号表所做的。它只是为特定类别的对象提供全局唯一标识,这些对象可以像:something
在源代码中一样编写,包括诸如标识符之类的东西:+
和:"Hi bob!"
不是标识符的东西。此外,仅使用标识符不会创建相应的符号。最后,以上段落中列出的信息都没有存储在 ruby 的符号列表中。
这是命名的巧合,阅读那篇文章不会帮助您理解红宝石的符号。
最大的不同是(像 Lisp 一样)Ruby 实际上有符号语法,而且很容易在运行时自己添加/删除东西。如果你说:balloon(或“balloon”.intern)它会为你实习。即使您在源代码中按名称引用它,但在内部它只是符号表中的一个指针。如果你比较符号,它只是一个指针比较,而不是字符串比较。
像 C 这样的语言并没有办法在运行时简单地说“为我创建一个新符号”。您可以通过定义一个函数在编译时隐式执行它,但这实际上是它的唯一用途。由于 C 语言没有符号语法,如果您想在程序中说出 Balloon,但又想将其与单个机器指令进行比较,您可以使用枚举(或 #defines)。
在 Ruby 中,一个符号只需要一个字符,所以你可以用它来做各种事情(比如哈希键)。
Ruby 中的符号用于其他语言倾向于使用枚举、定义、常量等的地方。它们也经常用于关联键。它们的使用与那篇文章中讨论的符号表几乎没有关系,除了它们显然存在于一个中。