【问题标题】:What is the class of keywords like def, alias, and begin in Ruby, if any?Ruby 中的 def、alias 和 begin 等关键字的类别是什么?
【发布时间】:2015-06-09 20:16:28
【问题描述】:

据我了解,Ruby 中的一切都是对象,每个对象都有一个超类,除了BasicObject,它位于继承树的顶部。

defbeginalias 等关键字的超类是什么?

【问题讨论】:

  • 据我所知,每个类都有一个超类。澄清一下,没有关键字具有超类。但是每个类都有超类 Object。
  • 那些关键字只是 ruby​​ 语言标识符,它们不属于也不属于类。当谈到“一切都是对象”的概念时,它是指在 ruby​​ 中如何处理数据的上下文中,换句话说,没有像 Java 或其他语言那样的原始值。
  • 关键字解析发生在...好吧,解析器。它们是语言语法工件,不是用 Ruby 编写的(无论如何是用于 MRI)。
  • @Emz 只是为了澄清起见,从 1.9 开始,最高级别的课程实际上是 BasicObjectObject.superclass #=> BasicObjectBasicObject.superclass #=> nil

标签: ruby class inheritance keyword superclass


【解决方案1】:

它们是关键字,而不是对象。如果有的话,它们将是Kernel 中的方法,因此具有类Method,但它们只是关键字,因此既没有类也没有超类。它们是特例,由口译员特殊处理;它们被解析以生成解释器实际执行的抽象语法树,并且在涉及对象和类的任何事情完成时可能早已不复存在。毕竟,end 作为一种方法是如何工作的?

请注意,并非所有看起来像关键字的东西都是。以loop为例:

loop do
  puts 'Hello, world!'
end

虽然它可能看起来像一个关键字,但它实际上是方法Kernel#loop

到目前为止,判断某事物是方法还是关键字的最简单方法是在其上运行这段冗长而复杂的代码:

method(name_to_test)

其中name_to_test 是 Symbol 文字或 Symbol 的一个实例。它使用始终可用的方法Object#method,该方法要么返回具有该名称的Method,要么抛出NameError。如果它静默运行——即不会引发任何错误——那么你就有了一个方法;如果它引发错误,则它不是一种方法。请注意,它也可以是变量,而不是关键字或方法,但通过查看文件中的先前代码并快速搜索文档应该很容易分辨。

如果您想查看当前的关键字列表(或者不想启动 IRB/您最喜欢的 IDE),请查看 RMI 源代码中的this file。这有点难以理解,但基本上,如果您在该列表中看到keyword_[thing you're looking for](可能删除了前导_),它就是一个关键字。为了使这个答案尽可能独立,这里是(当前)关键字列表,基于此:

__LINE____FILE____ENCODING__BEGINENDaliasandbeginbeginbreakclasscase,@98654349@ ,defined,do,else,elsif,end,ensure,false,for,in,next,next,next,@987654361 987654363 @,orredorescueretryreturnselfsuperthentrueundefwhenyieldifunlesswhileuntil

(非常感谢engineersmnky 指出列表!我自己永远不会找到它。)

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2012-04-30
    相关资源
    最近更新 更多