2015-08-20 4 views
7

आपने मॉड्यूल विधि को परिष्कृत करने केरुबी में मॉड्यूल विधि को परिशोधित कैसे करें?

module RefinedString 
    refine String do 
    def to_boolean(text) 
    !!(text =~ /^(true|t|yes|y|1)$/i) 
    end 
    end 
end 

लेकिन कैसे के साथ अपने वर्ग परिष्कृत कर सकते हैं? यह:

module RefinedMath 
    refine Math do 
    def PI 
     22/7 
    end 
    end 
end 

को जन्म देती है: TypeError: wrong argument type Module (expected Class)

उत्तर

1

शोधन केवल कक्षाएं, मॉड्यूल नहीं बदलें ताकि तर्क एक वर्ग का होना चाहिए।

- http://ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html

जैसे ही आप क्या कर रहे हो के बारे में पता कर रहे हैं, तो आप को परिशोधित मॉड्यूल तरीकों विश्व स्तर पर करने के लिए दो विकल्प हैं।

▶ Math.exp 2 
#⇒ 7.38905609893065 
▶ module Math 
▷ def self.exp arg 
▷  Math::E ** arg 
▷ end 
▷ end 
#⇒ :exp 
▶ Math.exp 2 
#⇒ 7.3890560989306495 

आप विधि की कार्यक्षमता को बचाने के लिए चाहते हैं या नहीं ओवरराइट किया जा करने के लिए:

▶ module Math 
▷ class << self 
▷  alias_method :_____exp, :exp 
▷  def exp arg 
▷  _____exp arg  
▷  end 
▷ end 
▷ end 
#⇒ Math 
▶ Math.exp 2 
#⇒ 7.3890560989306495 

कृपया साइड इफेक्ट के बारे में पता होना के बाद से गहरे लाल रंग का खुला वर्ग हैं, तो आप बस विधि ओवरराइड हो सकता है।

+1

तो वहाँ मॉड्यूल की विधि _refine_ लिए किसी भी तरह है? –

+0

उस समय मॉड्यूल को परिष्कृत करने का कोई तरीका नहीं है, क्योंकि यह स्पष्ट रूप से मेरे द्वारा लिंक किए गए दस्तावेज़ों में स्पष्ट रूप से बताया गया है। – mudasobwa

+0

बिल्कुल 'refine' विधि का उपयोग करने के अलावा अन्य समाधान हो सकता है और यही वह है जिसे मैं –

8

ठीक है, एक मॉड्यूल को परिभाषित करने के बाद से #method अपने #singleton_class पर एक उदाहरण विधि को परिभाषित करने के लिए equivalent है, निम्नलिखित काम करेगा:

module Math 
    def self.pi 
     puts 'original method' 
    end 
end 

module RefinementsInside 
    refine Math.singleton_class do 
     def pi 
      puts 'refined method' 
     end 
    end 
end 

module Main 
    using RefinementsInside 
    Math.pi #=> refined method 
end 

Math.pi #=> original method 
संबंधित मुद्दे