如果有的话,def、alias 和 begin in Ruby 等关键字的 class 是什么?

What is the class of keywords like def, alias, and begin in Ruby, if any?

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

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

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

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

loop do
  puts 'Hello, world!'
end

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

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

method(name_to_test)

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

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

__LINE__, __FILE__, __ENCODING__, BEGIN, END, alias, and, begin, break, case, class, def, defined, do, else, elsif, end, ensure, false, for, in, module, next, nil, not, or, redo, rescue, retry, return, self, super, then, true, undef, when, yield, if, unless, while, until

(非常感谢 engineersmnky 指出列表!我自己绝对找不到。)