2010-11-10 11 views
9

मैं पहली बार के लिए प्रोग्रामिंग रेल में कूद कर रहा हूँ और जबकि कुछ पुस्तकालयों मैं डाउनलोड किया है के लिए कोड को देखते हुए, मैं कभी कभी कोड नोटिस:क्या कोई कक्षा को समझा सकता है << स्वयं मुझे?

class << self 
    def func 
    stuff 
    end 
end 

मैं एक स्पष्टीकरण के लिए वेब की खोज करने की कोशिश की है , लेकिन < < सबसे उपयोगी खोज इंजन से छीन लिया जाता है, इसलिए यह केवल कक्षा स्वयं की खोज करता है, जो बहुत उपयोगी नहीं है। किसी भी जानकारी की सराहना की जाएगी।

+2

गूगल एक उपयोगी खोज इंजन नहीं है:

यहाँ कैसे सिंगलटन तरीकों का उपयोग करने के लिए कुछ "प्रक्रियाओं" जो वास्तव में एक विशेष उदाहरण के साथ किसी भी संघ की जरूरत नहीं है प्रदान करने के लिए का एक उदाहरण है? http://www.google.com/search?source=ig&hl=hi&rlz=&=&q=class+%3C%3C+self&btnG=Google+ खोज – McKay

+0

@McKay: http://forums.pragprog.com/forums के अलावा/77/विषय/657, जो वैड क्या कर रहा था उतना ही नहीं था, जो हिट वेड के प्रश्न के लिए प्रासंगिक थे? –

+0

पहले दो हिट दोनों प्रासंगिक हैं (तीसरे तर्कसंगत रूप से)। दूसरा लिंक (http://www.thekode.net/blog/blog.html) उस मुहावरे के बारे में विशेष रूप से और लिंक के बारे में बात करता है: http://www.thekode.net/ruby/techniques/DefiningMethodsWithClosures.html जो भी हो सकता है मदद। – McKay

उत्तर

12

रूबी में, class << fooसिंगलटन वर्ग वस्तु foo द्वारा संदर्भित को खोलता है। रुबी में, प्रत्येक ऑब्जेक्ट में एक सिंगलटन क्लास होता है जिसमें केवल एक ही उदाहरण होता है। इस सिंगलटन वर्ग में ऑब्जेक्ट-विशिष्ट व्यवहार होता है, यानी सिंगलटन विधियां।

तो, class << selfself के सिंगलटन वर्ग को खोलता है। वास्तव में self है, निश्चित रूप से उस संदर्भ पर निर्भर करता है जिसमें आप हैं। एक मॉड्यूल या कक्षा परिभाषा निकाय में, उदाहरण के लिए, यह मॉड्यूल या कक्षा स्वयं है।

यदि आप सिंगलटन कक्षा का उपयोग कर रहे हैं, तो सिंगलटन विधियों को परिभाषित कर रहा है, वास्तव में इसके लिए शॉर्टकट है: def foo.bar

class << (Util = Object.new) 
    def do_something(n) 
    # ... 
    end 
end 

Util.do_something(n) 
+0

तो मूल रूप से जिस तरह से रूबी हैंडल करता है कि जावा जैसी भाषा में एक स्थिर विधि क्या होगी? क्या कोई अंतर है? –

+0

@Wade - def हिस्सा एक स्थिर विधि की तरह है, हां। लेकिन आप ओपन क्लास << एंड ब्लॉक के अंदर क्लास-स्तरीय चर का उपयोग कर सकते हैं, और साथ ही साथ अन्य गतिशील चीजें भी कर सकते हैं। रुबी की कक्षा परिभाषाओं को निष्पादित किया जाता है, स्थिर रूप से नहीं पढ़ा जाता है। उदाहरण के लिए, आप वहां अन्य वर्ग स्तर के तरीकों को चला सकते हैं, और वहां अन्य वर्गों को परिभाषित कर सकते हैं। –

2

यह

def self.func 
    stuff 
end 

कि सिवाय के बराबर सभी तरीकों यह में नेस्ट वर्ग तरीके हैं है। यह आपको self पर प्रत्येक को डीकॉलर किए बिना कक्षा विधियों की घोषणा करने की अनुमति देता है।

+0

यह सिर्फ कक्षा के तरीकों से अधिक के लिए अच्छा है। – Chuck

+0

सच है, लेकिन यह सामान्य मामला है। –

संबंधित मुद्दे