【问题标题】:Is a symbol table in Ruby any different from a symbol table in other languagesRuby 中的符号表与其他语言中的符号表有什么不同
【发布时间】:2009-03-19 23:22:45
【问题描述】:

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

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

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

我想知道 Ruby 对符号表的处理方式与其他语言是否有任何重要区别?

【问题讨论】:

  • #Ellis 我稍微更改了您的文本以反映 Symbol.all_symbols 返回的对象的实际类;我这样做是为了阐明问题(因为我认为核心问题是术语)并帮助您获得适合您的答案。

标签: ruby symbol-tables


【解决方案1】:

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

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

澄清一下:

您链接到的文章给出了符号表的常规定义

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

但这不是 ruby​​ 的符号表所做的。它只是为某一类对象提供了一个全局唯一标识,在源代码中可以写成:something,包括像:+:"Hi bob!"这样的不是标识符的东西。此外,仅使用标识符不会创建相应的符号。最后,以上段落中列出的信息都没有存储在 ruby​​ 的符号列表中。

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

【讨论】:

  • Ruby 符号不是“Lispers 所谓的原子”。 Ruby 符号最接近于 Lisp 关键字,后者只是一种特殊的符号。例如,分数、向量和字符串都是 Lisp 中的原子,但与 Ruby 符号不同。
  • 也许您正在考虑 X11。我认为 X11 原子与 Ruby 和 Lisp 符号非常相似。
  • 那么,当你调用 Symbol.all_symbols 时,你不是在访问 Symbol 表吗?
  • @Ellis -- 您正在访问符号列表,但它不是“符号表”,因为您链接到的文章中使用了该术语。
  • @Ken 不,我是认真的。例如,当您在 ruby​​ 中添加两个整数时,您将消息 :+ 发送给接收者。上面有很多语法糖,下面有很多语义中性优化,但您可以使映射工作。
【解决方案2】:

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

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

在 Ruby 中,只需一个字符即可构成一个符号,因此您可以将它用于各种事物(如哈希键)。

【讨论】:

  • 根据上述 MarkusQ 的评论,“您正在访问符号列表,但它不是“符号表”,因为您链接到的文章中使用了该术语。”这与您的观点不同,即“在内部它(一个符号)只是符号表中的一个指针”
  • @Ellis -- Ken 和我并不像你想象的那样不同意。他所说的指向的符号表不是您在 C 之类的语言中发现的那种编译时结构(这就是您的链接文章的内容),他也提出了这一点.
  • 我认为我们的陈述是兼容的。 Ruby 有一个“符号”类型,它具有符号表符号的属性。但是 Symbol.all_symbols 没有返回(整个)Ruby 符号表,并且地址是隐藏的。希望在我们的两种观点之间,您可以推断出一些真相。 :-)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2021-09-15
    • 2020-06-29
    • 2012-02-11
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多