Ruby的“undef”对象是什么?

时间:2011-08-07 19:34:16

标签: ruby core

MRI implementation of gc.c中,我看到了一个名为undef的对象。什么是undef对象?它的课程是什么?我该如何访问它?它有什么用处吗?

2 个答案:

答案 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中的保留字,但它不是像nilfalsetrue这样的特殊对象,它是 - 正如我们所知道的那样 - 用于取消定义方法的关键字。

所以,要回答你的问题,没有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,因为您没有指定所有方法参数。