2013-02-26 165 views
30

की आवश्यकता है और इसमें शामिल हैं मैं रूबी मॉड्यूल (मिश्रण) का उपयोग करने की कोशिश कर रहा हूं।रूबी: मॉड्यूल,

#!/usr/bin/env ruby 
require_relative 'lib/mymodule' 

class MyApp 
    include MyModule 
    self.hallo 
end 

और lib/mymodule.rb:

module MyModule 
    def hallo 
    puts "hallo" 
    end 
end 

काफी साधारण सेटअप

मैं test.rb है। लेकिन यह :(काम नहीं करता है:।

ruby test.rb 
test.rb:8:in `<class:MyApp>': undefined method `hallo' for MyApp:Class (NoMethodError) 
     from test.rb:6:in `<main>' 

मेरी त्रुटि कहां है

उत्तर

53

संक्षेप में: आपको include मॉड्यूल के बजाय extend की आवश्यकता है।

class MyApp 
    extend MyModule 
    self.hallo 
end 

include वर्ग है कि यह में घुलमिल के लिए उदाहरण के तरीकों प्रदान करता है।

extend वर्ग है कि यह में घुलमिल के लिए वर्ग तरीकों प्रदान करता है।

दें this पढ़ने।

3

आपका कोड काम कर रहा है - लेकिन सहित एक मॉड्यूल आप क्या सोचते हैं यह करता है नहीं करता है मॉड्यूल सहित वर्ग नहीं मिलेगा । तरीकों - इस वर्ग इच्छा से वस्तुओं

तो यह काम करेगा:

class MyApp 
    include MyModule 
end 

my_app_object = MyApp.new 
my_app_object.hallo # => hallo 

my_app_object वर्ग MyApp, जो मॉड्यूल MyModule के mixins है की एक वस्तु है टी। मॉड्यूल और मिक्स्डिन के पूर्ण स्पष्टीकरण के लिए there देखें।

8

समस्या यह है कि आप क्लास परिभाषा में hallo पर कॉल कर रहे हैं, जबकि आप इसे एक इंस्टेंस विधि (include) के रूप में जोड़ते हैं। MyApp का एक उदाहरण में

module MyModule 
    def hallo 
    puts "hallo" 
    end 
end 

class MyApp 
    extend MyModule 
    self.hallo 
end 

या या तो कॉल hallo:

तो तुम भी उपयोग extend (hallo एक वर्ग विधि बन जाएगा) कर सकता है

module MyModule 
    def hallo 
    puts "hallo" 
    end 
end 

class MyApp 
    include MyModule 
end 

an_instance = MyApp.new 
an_instance.hallo 
1
class MyApp 
    class << self 
    include MyModule 
    end 
    self.hallo 
end 

रूप में ही है

class MyApp 
    extend MyModule 
    self.hallo 
end 

विस्तारित करता है कक्षा वस्तु को खोलता है और मॉड्यूल विधियों को शामिल करता है। "हेलो" एक वर्ग वस्तु उर्फ ​​बन जाता है। कक्षा MyApp की स्थिर विधि।

इसलिए "शामिल" को रिसीवर के उदाहरणों के तरीकों को इंजेक्ट करें, अपने मामले में ऑब्जेक्ट के लिए "स्वयं" नहीं है। रिसीवर को "स्वयं" होने के तरीकों को "विस्तार" करें।

self.include MyModule // inject the methods into the instances of self 
self.extend MyModule // inject the methods into object self 

कक्षा स्तर पर "स्वयं" आपकी कक्षा वस्तु को इंगित करेगा जो MyApp है।

यह भी याद रखें कि "शामिल" और "विस्तार" मॉड्यूल.आरबी में परिभाषित तरीकों हैं। "शामिल" एक क्लास ऑब्जेक्ट विधि (स्थैतिक-विधि) है और "विस्तार" एक उदाहरण विधि है।