NilClass
,TrueClass
和FalseClass
有一個實例的每個,即nil
,true
和false
,這是常量,什麼是具有這些類的目的是什麼?爲什麼他們不能成爲Object
類的實例,並且所有相關方法都被簡單地定義爲nil
,true
和false
上的單例方法?一個相關的問題是,爲什麼這些不被定義爲常量?什麼是NilClass,TrueClass的宗旨,FalseClass
回答
它始終堅持「一切都是對象」和「對象是由它們實例化的類所特化的」。
nil
,true
和false
都是對象(並且因此是具有方法的類的實例化)。他們是強制1)相應類型的唯一居民,並且是2)不可變對象允許實現優化 - 真的,不是一個nil
夠了嗎?
一個有用的錯誤消息,沒有專門的值:x.class
「正常工作」。
> > nil.foo
> => #<NoMethodError: undefined method `foo' for nil:NilClass>
我很高興它說NilClass
:-)
這個類實例的方法也使得重開NilClass
- 或好或壞 - 一樣方便,符合它如何爲完成其他類型。
至少與紅寶石1.9.2它是不可能的重新分配true
,false
或nil
(真/假的Python 2.x的允許重新分配,但不會在Python 3.X)。請注意,因爲true/false/nil
是而不是常量,所以它們可以在AST中進行優化 - 或者實現使用的任何內容 - 作爲「文字值」,而無需進行常量查找。
> > VERSION
> => "1.9.2"
> > true = false
> => #<SyntaxError: Can't change the value of true>
> > [].each {|true|}
> => #<SyntaxError: Can't change the value of true>
快樂編碼。
當然這些都是對象,並且必須屬於某個類。我在問爲什麼他們不能成爲Object類的實例。我會在不斷的答案中得到你的第二部分。這點讓我清楚。 – sawa
紅寶石採取的辦法「只取一個對象,一些單身方法添加到它」在某些時候:
C:\Documents and Settings\a.grimm>irb
irb(main):001:0> self.methods - Object.new.methods
給
[:大衆,:私有,:包括,:上下文,:CONF,:irb_quit,:退出, :退出,:irb_print_working_workspace,:irb_cwws,:irb_pwws,:cwws, :pwws,:irb_current_working_binding,:irb_print_working_binding, :irb_cwb,:irb_pwb,:irb_chws,: irb_cws,:chws,:cws, :irb_change_binding,:irb_cb,:cb,:工作區,:irb_bindings, :綁定,:irb_pushws,:pushws,:irb_push_binding,:irb_pushb, :pushb,:irb_popws,:popws,:irb_pop_binding,:irb_popb,:popb , :來源:就業,:FG,:殺,:幫助:irb_exit,:irb_context, :install_alias_method,:irb_current_working_workspace, :irb_change_workspace,:irb_workspaces,:irb_push_workspace, :irb_pop_workspace,:irb_load,:irb_require, :irb_source,:IRB, :irb_jobs,:irb_fg,:irb_kill,:irb_help]
我不知道他們爲什麼不這樣做的方法與true
,false
或nil
。也許是因爲人們需要理解這些對象(按照pst的答案),而人們不需要理解「主要」(?)對象。
主要對象對我來說似乎是一個特例。大多數程序從來沒有參考過,甚至一次引用。 – diedthreetimes
- 1. Redis的「evicted_keys」的宗旨
- 2. 宗旨,爲<頁面enableEventValidation =「假」>
- 3. 斯卡拉:同伴對象宗旨
- 4. 使FalseClass的行爲與使用元編程的TrueClass相似
- 5. 爲什麼不能在`Fixnum`,`Bignum`,`Float`,`Symbol`類對象中定義`singleton`方法,但是`FalseClass`和`TrueClass`可以有?
- 6. 宗旨,以創建匿名函數,並把它立即
- 7. 爲什麼Servlet.service旨在返回void?
- 8. 爲什麼NilClass#to_hash缺乏?
- 9. 爲什麼我們不能在Ruby中初始化TrueClass
- 10. Rails mock_model返回TrueClass?
- 11. wget的不是正宗的HTTPS URL vaultpress
- 12. 旨在爲
- 13. 爲什麼可以將布爾數組寫入宗地而不是布爾值?
- 14. Rails:不支持:TrueClass錯誤
- 15. 爲什麼我收到此錯誤如此:在這裏字符串TrueClass(NoMethodError)
- 16. NoMethodError:未定義的方法`[]」假:FalseClass
- 17. 從大宗交易
- 18. div破祖宗div
- 19. 爲什麼我得到「未定義的方法」+'爲零:NilClass「?
- 20. Java旨在成爲'Threaded'
- 21. Rspec2局部視圖給出零:NilClass。爲什麼?
- 22. xmlrpc的用戶憑據不是正宗的邏輯
- 23. 按主旨進行查詢的次數
- 24. 發佈與Github的API要旨
- 25. 爲什麼我得到未定義的方法`before_save'爲false:如果在保存之前使用FalseClass?
- 26. 什麼是靜態庫,什麼是動態庫,有什麼區別,什麼是更好的使用,爲什麼?
- 27. 這對於linkedin gem意味着什麼?未定義的方法`downcase」的零:NilClass
- 28. 爲什麼RSpec的失敗,未定義的方法[]無:: NilClass爲AWS_CONFIG [ '鬥']
- 29. WinASM和禪宗大會的問題
- 30. 帶有字符的禪宗條碼。 Winforms
好問題,它在Python中也是這樣,所以背後肯定有一些很好的理由。 –
ruby中的常量並不是真正的常量,http://www.rubyist.net/~slagell/ruby/constants.html – house9
給你一個問題。 * NOT *對每個值都有單獨的類會有什麼好處?使用單例方法幾乎不是最簡單的解決方案,並增加了IMO不需要的複雜性。 – diedthreetimes