2011-11-06 6 views
6

NilClass, TrueClass और FalseClassnil, true और false, जो स्थिरांक हैं एक उदाहरण होने प्रत्येक, अर्थात्, इन कक्षाओं में होने का उद्देश्य क्या है? वे Object कक्षा के उदाहरण क्यों नहीं हो सकते हैं, और सभी प्रासंगिक तरीकों को nil, true और false पर सिंगलटन विधियों के रूप में परिभाषित किया जा सकता है? एक संबंधित सवाल यह है कि इन्हें स्थिरांक के रूप में क्यों परिभाषित नहीं किया जाता है?NilClass, TrueClass का उद्देश्य क्या है, और FalseClass

+1

अच्छा सवाल, यह पाइथन में भी ऐसा है, इसलिए इसके पीछे कुछ अच्छा कारण होना चाहिए। –

+0

रूबी में स्थिरता वास्तव में स्थिर नहीं हैं, http://www.rubyist.net/~slagell/ruby/constants.html – house9

+0

आपको एक प्रश्न है। इन मूल्यों में से प्रत्येक के लिए अलग-अलग कक्षाएं * नहीं * का लाभ क्या होगा? सिंगलटन विधियों का उपयोग करना शायद ही सबसे सरल समाधान है और अनियंत्रित जटिलता आईएमओ जोड़ता है। – diedthreetimes

उत्तर

11

यह इस विचार के साथ रहता है कि "सबकुछ एक वस्तु है" और "वस्तुओं को उन वर्गों द्वारा विशिष्ट किया जाता है जिनके उदाहरण हैं"।

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 करना संभव नहीं है (सही/गलत का अजगर 2.x की अनुमति दी फिर से काम, लेकिन अजगर 3.x में नहीं है)। ध्यान दें कि true/false/nil स्थिरांक हैं जिन्हें उन्हें एएसटी में अनुकूलित किया जा सकता है - या जो कुछ भी कार्यान्वयन का उपयोग करता है - निरंतर लुकअप के बिना "शाब्दिक मूल्य" के रूप में।

> > 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

बेशक ये वस्तुएं हैं, और कुछ वर्ग से संबंधित हैं। मैं पूछ रहा हूं कि वे 'ऑब्जेक्ट' वर्ग के उदाहरण क्यों नहीं हो सकते हैं। मैं निरंतर के बारे में उत्तर का अपना दूसरा हिस्सा प्राप्त करता हूं। वह मुझे उस बिंदु से साफ़ करता है। – 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,: workspaces,: 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_jobs,: irb_fg,: irb_kill,: irb_help]

मैं नहीं जानता कि क्यों वे true, false या 0 के साथ इस दृष्टिकोण नहीं करते। शायद क्योंकि लोगों को इन वस्तुओं को समझने की आवश्यकता है (पीएसटी के जवाब के अनुसार), जबकि लोगों को "मुख्य" (?) वस्तु को समझने की आवश्यकता नहीं है।

+0

मुख्य वस्तु मुझे एक विशेष मामले की तरह लगती है। अधिकांश कार्यक्रम कभी भी संदर्भित नहीं करते हैं। – diedthreetimes