2011-11-06 7 views
6

NilClassTrueClassFalseClass、すなわち、それぞれ定数であるniltruefalseを、1つのインスタンスを持つ何NilClass、TrueClassの目的である、とFalseClassの?なぜ彼らはObjectクラスのインスタンスになれないのですか?関連するすべてのメソッドは、niltruefalseのシングルトンメソッドとして単純に定義されていますか?関連する質問は、なぜこれらは定数として定義されていないのですか?これらのクラスを持つことの目的は何である、

+1

良い質問ですが、これはPythonでも同様です。なぜなら、その背後には何らかの理由があるに違いありません。 –

+0

ルビーの定数は実際には一定ではありません。http://www.rubyist.net/~slagell/ruby/constants.html – house9

+0

あなたへの質問。これらの値のそれぞれに別のクラスを持たない* NOT *のメリットは何ですか?シングルトン法を使用することはめったに簡単ではなく、不要な複雑さのIMOを追加します。 – diedthreetimes

答えて

11

「すべてがオブジェクトです」と「オブジェクトはインスタンスのクラスによって特殊化されています」という考え方が続きます。

niltrue、およびfalseはすべてオブジェクトです(したがって、メソッドを含むクラスのインスタンス化です)。それらは1)それぞれのタイプの唯一の住人であり、2)不変オブジェクトは実装の最適化を可能にします - 実際にはのいずれかではありませんnilで十分ですか?

値の特殊化がない便利なエラーメッセージ:x.class「ただ動作します」。

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

私はそれを言っ嬉しいNilClass :-)

このクラスインスタンスのアプローチはまた、再オープンNilClassを作る - それがために行われるかもしれない方法で簡単かつ一貫として - のために良いか悪いですか他のタイプ。

少なくともルビーのように再割り当てtruefalse又はnilすることは不可能である1.9.2(真/偽の再割り当て許可の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'クラスのインスタンスにならない理由を尋ねています。私はあなたの答えの2番目の部分を一定にします。その点でそれは私をクリアする。 – sawa

1

Rubyは "ただのオブジェクトを取ると、それにいくつかのシングルトンメソッドを追加" の時間のいくつかのアプローチ取ります、民間::公共、:

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]

彼らはtruefalseまたは0で、このアプローチをしない理由を私は知りません。人々はこれらのオブジェクトを(pstの答えごとに)理解する必要があるのに対して、人々は「メイン」(?)オブジェクトを理解する必要はないからかもしれません。

+0

主なオブジェクトは私にとって特別なケースのようです。ほとんどのプログラムは一度も参照することはありません。 – diedthreetimes

関連する問題