在MRI implementation of gc.c中,我看到一個名爲undef
的對象。那是什麼undef
對象?它的課程是什麼?我怎樣才能訪問它?有沒有其他用途?什麼是Ruby的「undef」對象?
回答
對我而言,這是一個有教養的猜測,也許馬茨會在某個時候看到這個問題,並給我們一個明確的答案,希望這會在此期間做。你可能知道,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_id
,undef
的確是Ruby的保留字,但它不是一個特殊的物體,像nil
,false
和true
,它是 - 我們知道 - 一個用於取消定義方法的關鍵字。
所以,要回答你的問題,沒有undef
對象,它沒有類,你不能訪問它。 undef
旨在服務的目的是由我們今天知道的Ruby中的nil
對象服務。但是,它仍然留在代碼中,作爲時代的遺產,因爲我們更加好奇的尋找和解決困惑。
我發現它不是一個對象,因爲我無法用'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)。 –
併爲您的關於值的鏈接+1。謝謝! :) –
在最後一個例子中,我覺得像Qundef被用來覆蓋被刪除的實例變量的值。爲了讓Ruby在嘗試訪問該實例變量時拋出異常,必須有必要。如果他們只是使用Qnil,那麼我的猜測是你不會得到一個異常,而是會返回作爲返回值而不是你想要的行爲。非常有趣,我非常喜歡看這個 - 很好的問題。 – skorks
我敢肯定,這是指一個未定義的變量(與定義爲nil
的變量相反)。
看看這個:
def hello(object = 'World')
puts "Hello #{object}"
end
hello #=> 'Hello World'
hello 'stackoverflow' #=> 'Hello stackoverflow'
hello nil #=> 'Hello '
編輯: 要以更加完整的回答你的問題得出結論。你將永遠無法訪問那個對象undef
。它只存在於方法定義中,而不存在於其正文中。它可以填充一個默認值(如上面的'World'
),或者您將得到一個ArgumentError
,因爲您沒有指定所有的方法參數。
- 1. Ruby的對象模型是什麼?
- 2. 爲什麼我的哈希不是undef?
- 3. 什麼是Ruby的對象#污點和對象#信任方法?
- 4. 爲什麼event.ctrlKey返回undef?
- 5. 什麼是對象SqlConnection.BeginTransaction對
- 6. 玷污Ruby對象的目的是什麼?
- 7. 'attr_accessor'在Ruby中創建對象的目的是什麼?
- 8. 什麼是c中的ruby異常類對象的擴展?
- 9. Ruby中的CSV對象。他們究竟是什麼?
- 10. 我需要響應.map(&:key)的對象是什麼? (ruby)
- 11. PHP對象 - 什麼是對象?
- 12. 是什麼是什麼的區別新對象{}和新的對象(){}
- 13. 什麼是龜對象?
- 14. 什麼是'NoneType'對象?
- 15. 什麼是持久對象?
- 16. 什麼是任意對象?
- 17. 什麼是對象分解?
- 18. 什麼是對象鑄造?
- 19. 什麼是JavaScript對象
- 20. 什麼是T []對象?
- 21. 什麼是[對象窗口]?
- 22. Calendar是什麼對象?
- 23. 什麼是對象k?
- 24. 是什麼*和對象
- 25. 什麼是Class對象(java.lang.Class)?
- 26. 什麼是javascript`window.Notation`對象?
- 27. 爲什麼對象是Perl
- 28. 什麼是Graphics對象?
- 29. 什麼是承諾對象?
- 30. 什麼是對象蝕晶?
我不知道它是什麼,但它可能與用於取消定義方法的'undef'方法無關。 –
@安德魯格林,是的,我同意! –