据我所知,Ruby中的所有内容都是一个对象,每个对象都有一个超类,除了BasicObject
,它位于继承树的顶部。
def
,begin
和alias
等关键字的超类是什么?
答案 0 :(得分:7)
他们是关键词,而不是对象。如果有的话,它们就是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__
,BEGIN
,END
,alias
,and
,begin
,break
,case
,class
,def
,defined
,do
,else
,elsif
,{ {1}},end
,ensure
,false
,for
,in
,module
,next
,{{1 }},nil
,not
,or
,redo
,rescue
,retry
,return
,self
,super
,then
,true
,undef
,when
,yield
,if
,unless
(非常感谢engineersmnky指出列表!永远不会自己找到它。)