2011-08-07 32 views

回答

5

對我而言,這是一個有教養的猜測,也許馬茨會在某個時候看到這個問題,並給我們一個明確的答案,希望這會在此期間做。你可能知道,Ruby至少在早些時候受到perl的影響(這就是爲什麼我們有像$ @和$ _等變量)。 Perl有一個undef關鍵字/函數(例如,如果你聲明一個變量沒有初始化 - 它的值是未定義的)。我會說,在過去的某個時候,Ruby也意味着有類似的東西(即變量可以有一個未定義的值)。我們怎麼知道呢?在它被發現的上下文中。

如您所見,該評論描述瞭如何派生出各種Ruby對象的object_id。一些細節可以在here找到。但是,在本質上,我們知道以下內容:

false.object_id == 0 
true.object_id == 2 
nil.object_id == 4 

這是個什麼意見建議,這的確是這樣的,你可以破解打開一個irb會話,並嘗試一下自己。它看起來像undef是爲了有6

現在的object_idundef的確是Ruby的保留字,但它不是一個特殊的物體,像nilfalsetrue,它是 - 我們知道 - 一個用於取消定義方法的關鍵字。

所以,要回答你的問題,沒有undef對象,它沒有類,你不能訪問它。 undef旨在服務的目的是由我們今天知道的Ruby中的nil對象服務。但是,它仍然留在代碼中,作爲時代的遺產,因爲我們更加好奇的尋找和解決困惑。

+0

我發現它不是一個對象,因爲我無法用'ObjectSpace._id2ref(6)'檢索一個對象。它在[許多地方](http://rxr.whitequark.org/mri/ident?i=Qundef)和[這裏](http://rxr.whitequark.org/mri/source/include/ruby/)上找到ruby.h#352)它被認爲是「未定義的佔位符值」。實際上,它用於表示未定義(或空值)而不是0,-1,NULL等。似乎有必要避免與任何有效的Ruby對象發生衝突。一個很好的例子是[使已刪除的實例變量無效](http://rxr.whitequark.org/mri/source/variable.c#1279)。 –

+0

併爲您的關於值的鏈接+1。謝謝! :) –

+0

在最後一個例子中,我覺得像Qundef被用來覆蓋被刪除的實例變量的值。爲了讓Ruby在嘗試訪問該實例變量時拋出異常,必須有必要。如果他們只是使用Qnil,那麼我的猜測是你不會得到一個異常,而是會返回作爲返回值而不是你想要的行爲。非常有趣,我非常喜歡看這個 - 很好的問題。 – skorks

-2

我敢肯定,這是指一個未定義的變量(與定義爲nil的變量相反)。

看看這個:

def hello(object = 'World') 
    puts "Hello #{object}" 
end 

hello     #=> 'Hello World' 
hello 'stackoverflow' #=> 'Hello stackoverflow' 
hello nil    #=> 'Hello ' 

編輯: 要以更加完整的回答你的問題得出結論。你將永遠無法訪問那個對象undef。它只存在於方法定義中,而不存在於其正文中。它可以填充一個默認值(如上面的'World'),或者您將得到一個ArgumentError,因爲您沒有指定所有的方法參數。

+0

啊,我花了一分鐘的時間來掌握你的答案。完全沒有任何參數傳遞給方法和傳遞'nil'是有區別的。這個區別是'undef'對象。那是你在說什麼? – mikezter

+0

正確的默認參數值只有在傳遞字面上沒有值時纔會優先考慮。 – Koraktor