2009-03-03 10 views
5

मैंने अपने रेल अनुप्रयोग में github.com से act_as_versioned प्लगइन स्थापित किया है, और कोड का एक ब्लॉक था जिसे मैं पूरी तरह से समझ नहीं पा रहा था, मुझे उम्मीद थी कि कोई मेरे लिए इसे साफ़ कर सकता हैरुबी के बारे में सामान्य सवाल

class_eval <<-CLASS_METHODS 
    def a_bunch_of_stuff 
    .... 
    end 
CLASS_METHODS 

मुझे मिलता है कि ब्लॉक के अंदर की विधियां (या जो भी हो) कक्षा के अंदर उदाहरण विधियों के रूप में परिभाषित हो जाती है, लेकिन मुझे प्लगइन में कहीं भी स्थिरता के रूप में परिभाषित CLASS_METHODS नहीं मिल रहा है, और मुझे यह भी सुनिश्चित नहीं है कि < < - class_eval के बाद माध्यम। प्लगइन here स्थित है, और प्रश्न में कोड lib/act_as_versioned.rb की पंक्ति 199 पर शुरू होता है। अगर कोई मुझे यहां कम डाउनडाउन देगा, तो मैं बहुत बाध्य होगा।

thx

-C

उत्तर

7

यह एक हेडोकोक है। http://en.wikipedia.org/wiki/Heredoc#Ruby

मिलान किए गए CLASS_METHODS टोकन अनिवार्य रूप से प्रारंभ और उद्धरण समाप्त कर रहे हैं। यदि आप < < का उपयोग करते हैं - < < के बजाय, अंतिम टोकन को व्हाइटस्पेस से इंडेंट किया जा सकता है।

आप रूबी में एक साथ कई heredocs उपयोग कर सकते हैं (मैं अपने heredocs तर्क के नाम के रूप में ही किया जाता है, लेकिन यह सिर्फ सौंदर्य के लिए है - यह कोई फर्क नहीं पड़ता):

def define_with_description description, code 
    puts "defining a method to #{description}" 
    class_eval code 
end 

define_with_description <<-DESCRIPTION, <<-CODE 
    set up us the bomb 
DESCRIPTION 
    Bomb.new.set_up(us) 
CODE 
6

यह एक "here document", जो इनलाइन बड़ी बहु तार के हवाले करने का एक तरीका है। Programming Ruby से:

स्ट्रिंग्स कई इनपुट लाइनों में जारी रह सकती हैं, इस मामले में उनमें न्यूलाइन वर्ण होंगे। लंबी स्ट्रिंग अक्षरों को व्यक्त करने के लिए दस्तावेज़ों का उपयोग करना भी संभव है। जब भी रूबी <<identifier या <<quoted string अनुक्रम को पार करता है, तो यह लगातार तार्किक इनपुट लाइनों से निर्मित स्ट्रिंग अक्षर के साथ बदल देता है। यह स्ट्रिंग का निर्माण बंद कर देता है जब उसे पहचानकर्ता या उद्धृत स्ट्रिंग के साथ शुरू होने वाली रेखा मिलती है। आप << वर्णों के तुरंत बाद एक ऋण चिह्न डाल सकते हैं, इस स्थिति में टर्मिनेटर को बाएं हाशिए से इंडेंट किया जा सकता है। यदि टर्मिनेटर निर्दिष्ट करने के लिए उद्धृत स्ट्रिंग का उपयोग किया गया था, तो इसके उद्धरण नियम यहां दस्तावेज़ पर लागू होंगे; अन्यथा, डबल-कोटिंग नियम लागू होते हैं।

यह class_eval कारण एक स्ट्रिंग के रूप CLASS_METHODS के बीच सामान का इलाज और उचित संदर्भ में निष्पादित करने के लिए होगा। CLASS_METHODS नाम का उपयोग मनमाने ढंग से है, यह आसानी से कुछ भी कहलाता है।

-2

ये बराबर हैं:

class SomeClass 
    class_eval <<-CLASS_METHODS 
    def first_method 
    end 
    def second_method 
    end 
    CLASS_METHODS 
end 

class SomeClass 
    def self.first_method 
    end 
    def self.second_method 
    end 
end 
संबंधित मुद्दे