2011-11-06 107 views
6

NilClassTrueClassFalseClass有一個實例的每個,即niltruefalse,這是常量,什麼是具有這些類的目的是什麼?爲什麼他們不能成爲Object類的實例,並且所有相關方法都被簡單地定義爲nil,truefalse上的單例方法?一個相關的問題是,爲什麼這些不被定義爲常量?什麼是NilClass,TrueClass的宗旨,FalseClass

+1

好問題,它在Python中也是這樣,所以背後肯定有一些很好的理由。 –

+0

ruby​​中的常量並不是真正的常量,http://www.rubyist.net/~slagell/ruby/constants.html – house9

+0

給你一個問題。 * NOT *對每個值都有單獨的類會有什麼好處?使用單例方法幾乎不是最簡單的解決方案,並增加了IMO不需要的複雜性。 – diedthreetimes

回答

11

它始終堅持「一切都是對象」和「對象是由它們實例化的類所特化的」。

nil,truefalse都是對象(並且因此是具有方法的類的實例化)。他們是強制1)相應類型的唯一居民,並且是2)不可變對象允許實現優化 - 真的,不是一個nil夠了嗎?

一個有用的錯誤消息,沒有專門的值:x.class「正常工作」。

> > nil.foo 
> => #<NoMethodError: undefined method `foo' for nil:NilClass> 

我很高興它說NilClass :-)

這個類實例的方法也使得重開NilClass - 或好或壞 - 一樣方便,符合它如何爲完成其他類型。

至少與紅寶石1.9.2它是不可能的重新分配truefalsenil(真/假的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 {|tru­e|} 
> => #<SyntaxError: Can't change the value of true> 

快樂編碼。

+0

當然這些都是對象,並且必須屬於某個類。我在問爲什麼他們不能成爲Object類的實例。我會在不斷的答案中得到你的第二部分。這點讓我清楚。 – sawa

1

紅寶石採取的辦法「只取一個對象,一些單身方法添加到它」在某些時候:

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]

我不知道他們爲什麼不這樣做的方法與truefalsenil。也許是因爲人們需要理解這些對象(按照pst的答案),而人們不需要理解「主要」(?)對象。

+0

主要對象對我來說似乎是一個特例。大多數程序從來沒有參考過,甚至一次引用。 – diedthreetimes

相關問題