在MRI implementation of gc.c中,我看到了一个名为undef
的对象。什么是undef
对象?它的课程是什么?我该如何访问它?它有什么用处吗?
答案 0 :(得分:5)
对我来说,这是一个有根据的猜测,也许Matz会在某个时候看到这个问题,并给我们一个明确的答案,希望这会在此期间做到。
正如您可能知道的那样,ruby至少在早期就受到了perl的影响(这就是为什么我们有变量如$ @和$ _等)。 Perl有一个undef
关键字/函数(例如,如果你声明一个没有初始化的变量 - 它的值是未定义的)。我想说,在过去的某个时间,Ruby也意味着有类似的东西(即变量可以有一个未定义的值)。我们怎么知道呢?根据它的上下文。
如您所见,该注释描述了如何派生各种Ruby对象的object_id
。有关详细信息,请参见here。但是,实质上我们知道以下内容:
false.object_id == 0
true.object_id == 2
nil.object_id == 4
这是评论建议的内容,确实如此,您可以破解irb
会话并亲自试用。 undef
似乎意味着object_id
为6。
现在,undef
确实是Ruby中的保留字,但它不是像nil
,false
和true
这样的特殊对象,它是 - 正如我们所知道的那样 - 用于取消定义方法的关键字。
所以,要回答你的问题,没有undef
对象,它没有类,你无法访问它。 undef
意味着服务的目的是由我们今天所知的Ruby中的nil
对象提供服务。但是,它仍然留在代码中作为时代遗留下来的遗产,因为我们更好奇地发现并谜题。
答案 1 :(得分:-2)
我很确定这是指一个未定义的变量(而不是定义为nil
的变量)。
看看这个:
def hello(object = 'World')
puts "Hello #{object}"
end
hello #=> 'Hello World'
hello 'stackoverflow' #=> 'Hello stackoverflow'
hello nil #=> 'Hello '
修改强>
最后给出一个更完整的答案。您将永远无法访问该undef
对象。它只存在于方法定义中,而不存在于其体内。它填充了默认值(如上面的'World'
),或者您将获得ArgumentError
,因为您没有指定所有方法参数。