Ruby中的符号表与其他语言中的符号表有任何不同

时间:2009-03-19 23:22:45

标签: ruby symbol-tables

符号表上的维基百科条目是一个很好的参考:

http://en.wikipedia.org/wiki/Symbol_table

但是当我尝试理解Ruby中的符号以及它们如何在符号数组中表示时(由Symbol.all_symbols方法返回),

我想知道Ruby对符号表的方法是否与其他语言有任何重大差异?

3 个答案:

答案 0 :(得分:6)

Ruby在这个意义上并没有真正的“符号表”。它有绑定和符号(lispers调用atoms),但实际上并没有按照文章描述的方式进行。

所以在回答你的问题时:并不是说ruby有不同的做法,而是做了两件不同的事情(:xxx符号 - >范围内的唯一ID和绑定并使用类似/重叠的术语。

澄清:

您链接的文章提供了符号表的传统定义,即

  

其中程序源代码中的每个标识符与源中的声明或外观相关的信息相关联,例如其类型,范围级别以及有时其位置

但这不是ruby的符号表所做的。它只为特定类别的对象提供全局唯一标识,可以在源代码中写为:something,包括:+:"Hi bob!"这些不是标识符的内容。而且,仅使用标识符将不会创建相应的符号。最后,上面这段经文中列出的信息都没有存储在ruby的符号列表中。

这是命名的巧合,读这篇文章不会帮助你理解ruby的符号。

答案 1 :(得分:1)

最大的区别在于(像Lisp一样)Ruby实际上有一个符号的语法,并且很容易在运行时自己添加/删除东西。如果你说:balloon(或“balloon”.intern)它会为你实习。即使您在源代码中按名称引用它,但在内部它只是符号表中的指针。如果比较符号,它只是一个指针比较,而不是字符串比较。

像C这样的语言实际上没有办法在运行时简单地说“为我创建一个新符号”。您可以通过定义函数在编译时隐式执行此操作,但这确实是它的唯一用途。由于C没有符号语法,如果您希望能够在程序中说Balloon但能够将其与单个机器指令进行比较,则可以使用枚举(或#defines)。

在Ruby中,只需要一个字符来制作符号,因此您可以将它用于各种事物(如散列键)。

答案 2 :(得分:1)

Ruby中的符号用于其他语言倾向于使用枚举,定义,常量等的地方。它们也经常用于关联键。它们的使用与该文章中讨论的符号表几乎没有关系,只是它们显然存在于一个符号表中。