2011-01-10 46 views
12

संभावित डुप्लिकेट:
class << self idiom in Ruby
Can someone please explain class << self to me?रेल में "वर्ग << स्वयं" का अर्थ क्या है?

मुझे पता है कि क्या class << self बयान एक मॉडल कक्षा में क्या मतलब है चाहते हैं? और इसके अंदर का विवरण इसके बाहर के लोगों से अलग कैसे है। उदाहरण के लिए:

class Post < ActiveRecord::Base 

    class << self 
    def search(q) 
      # search from DB 
    end 
    end 
    def search2(qq) 
     # search from DB 
    end 
end 

class << self का क्या अर्थ है?

विधि search(q) और search2(qq) के बीच क्या अंतर है?

+0

खोज 2 एक बहुत ही खराब विधि नाम है। –

+0

और यह भी रूबी में का डुप्लिकेट [रेल वर्ग << स्वयं] (http://stackoverflow.com/questions/2567956/rails-class-self) और [ 'self.method_name' के बीच अंतर और 'वर्ग << स्वयं' ] (http: // stackoverflow।कॉम/प्रश्न/2025569/अंतर-बीच-स्व-विधि-नाम-और-वर्ग-स्व-इन-रूबी) और [क्या कोई कक्षा को समझा सकता है << स्वयं को मुझे?] (http://stackoverflow.com/questions/4149700/कर सकते हैं-कोई-कृपया-समझाने-वर्ग-आत्म-टू-मुझे)। प्रश्न पोस्ट करने से पहले कृपया खोजें। – Phrogz

उत्तर

22

class Post < ActiveRecord::Base 

    def self.search(q) 
    # Class Level Method 
    # search from DB 
    end 

    def search2(qq) 
    # Instance Level Method 
    # search from DB 
    end 
end 

कक्षा तरीकों वर्ग (पोस्ट जैसे) पर काम के रूप में ही है, उदाहरण के तरीकों कि वर्ग के उदाहरण (जैसे पोस्ट पर काम करता है। नया)

कुछ class << self; code; end; तरह से जैसे लोगों की वजह से यह एक अच्छा ब्लॉक में और एक ही स्थान पर सभी वर्ग के स्तर तरीकों रहता है।

दूसरों self. साथ प्रत्येक विधि उपसर्ग के लिए स्पष्ट रूप से पता चला है कि एक वर्ग विधि नहीं एक उदाहरण विधि है पसंद है। यह शैली का विषय है और आप कैसे कोड करते हैं। यदि आप class << self जैसे ब्लॉक में सभी क्लास विधियां डालते हैं, और यह ब्लॉक काफी लंबा है, तो class << self लाइन आपके संपादक दृश्य से बाहर हो सकती है जिससे यह जानना मुश्किल हो जाता है कि आप क्लास इंस्टेंस ब्लॉक में हैं।

दूसरी ओर, प्रत्येक विधि को self. के साथ उपसर्ग करना और उदाहरण विधियों वाले लोगों को इंटरमीक्स करना भी एक बुरा विचार है, आप अपने कोड को पढ़ने के दौरान सभी कक्षा विधियों को कैसे जानते हैं।

एक मुहावरा है जो आप अपने खुद के कोड बेस के लिए पसंद करते हैं, लेकिन अगर आप एक खुला स्रोत परियोजना पर काम या आप किसी और की कोड पर सहयोग करने, नियम स्वरूपण उनके कोड का उपयोग उठाओ।

1

यह उदाहरण विधियों के विपरीत वर्ग विधियों का निर्माण करता है। यह def self.search(q) करने जैसा ही है। उन दो तरीकों की तरह कहा जा सकता है:

Post.search(q) 
Post.new.search(qq) 
0

search2 जबकि search एक वर्ग विधि है एक उदाहरण-विधि है। class << self वाक्यविन्यास आपको नीचे वर्ग वर्ग विधियों को समूहबद्ध करने में सक्षम बनाता है। रुबी में कक्षा विधियों को परिभाषित करने के तीन तरीके हैं:

class MyClass 
    def self.method 
     # do sth. 
    end 

    def MyClass.method2 
     # do sth. 
    end 

    class << self 
     def method3 
      # do sth. 
     end 

     def another_class_method 
      # do sth. 
     end 
    end 
end 

क्लास-विधियों को कक्षा में बुलाया जाता है, उदाहरण पर नहीं। यह व्यक्तिगत वरीयता है जिसमें से तीन मुहावरे आप उपयोग करना चाहते हैं। मैं किसी विशेष कारण के लिए def self.method पसंद करता हूं।

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