2012-07-17 25 views
5

रूबी में, मैं कक्षा बनाने की कोशिश कर रहा हूं, जो प्रारंभिकरण के दौरान दिए गए मान पर आधारित निम्न मॉड्यूल में से एक का उत्तराधिकारी होगा। मैं एक आधार मॉड्यूल बनाना चाहता हूं कि इन दोनों मॉड्यूलों में से प्रत्येक के पास सामान्य विधियां हैं जो कि प्राप्त करने वाले मॉड्यूल में परिभाषित स्थिरांक का उपयोग करती हैं। उदाहरण:रूबी मॉड्यूल

NameError: uninitialized constant BaseMod::OUTPUT 
    const_missing at org/jruby/RubyModule.java:2642 
     what_am_i at test_logic2.rb:3 
     (root) at test_logic2.rb:28 

मैं भी वहाँ ऐसा करने के बारे में जाने के लिए एक बेहतर तरीका है सोच रहा हूँ:

module BaseMod 
    def what_am_i 
    puts OUTPUT 
    end 
end 

module Tall 
    OUTPUT = "I am tall" 
    include BaseMod 
end 

module Short 
    OUTPUT = "I am short" 
    include BaseMod 
end 

class Person 
    def initialize type 
    if type =~ /short/i 
     extend Short 
    else 
     extend Tall 
    end 
    end 
end 

p = Person.new "short" 
p.what_am_i 

मेरे मुद्दा यह है कि जब "p.what_am_i" कहा जाता है मैं निम्नलिखित त्रुटि मिलती है।

module Tall 
::OUTPUT = "I am tall" 
include BaseMod 
end 

हालांकि लगता है कि आप मॉड्यूल कम की घोषणा के साथ लगातार को पुनर्परिभाषित कर रहे हैं:

उत्तर

2

आप अपनी स्थिति में लगातार कुछ इस तरह लिखने के लिए प्राप्त करने के लिए। इसके लिए आपको हमेशा "मैं छोटा हूं" प्राप्त करूंगा।

तो इसे सही ढंग से करने के लिए आप की कोशिश करनी चाहिए करने के लिए:

module BaseMod 
OUTPUT="Before" 
def what_am_i 
    puts OUTPUT 
end 
end 

module Tall 
def self.extended(k) 
    OUTPUT.replace "I am tall" 
end 
include BaseMod 
end 

module Short 
def self.extended(k) 
    OUTPUT.replace "I am short" 
end 
include BaseMod 
end 

कश्मीर

0

ऐसा लगता है कि जब आप संदेश #what_am_i संदेश के साथ अपने व्यक्ति पी, दुभाषिया क्रमिक उच्च और विधि लागू करने के लिए लग रहा है कक्षा पूर्वजों में उच्च, और अंततः इसे बेसमोड में पाता है, लेकिन उस स्तर पर, OUTPUT निरंतर परिभाषित नहीं किया जाता है। तो मुझे लगता है कि रुबी पदानुक्रम में निरंतर ऊपर पर जा रहा है, लेकिन टाल और शॉर्ट मॉड्यूल में नीचे की ओर देखने के बारे में नहीं सोचता है, जहां इसे परिभाषित किया गया है। मनोबल यह है कि यहां तक ​​कि यदि आप बहुत सारे सबोड्यूल्यूल शामिल करते हैं, तो वे एक ही ढेर में नहीं आते हैं, जहां सभी स्थिरांक सभी के लिए सुलभ होते हैं, लेकिन इसके बजाय वे अपने पदानुक्रम को उनके समावेशन के विपरीत क्रम में रखते हैं (टाल देखें। पूर्वजों)। किसी भी स्तर पर, केवल एक ही स्तर या उच्च स्तर स्थिरांक उपलब्ध हैं। मैं आपकी समस्या को निम्न तरीके से हल करूंगा:

module Personhood 
    def what_am_i; @output end 
end 

class Tall 
    include Personhood 
    def initialize 
     @output = "I am tall" 
    end 
    end 
end 

class Short 
    include Personhood 
    def initialize 
     @output = "I am short" 
    end 
    end 
end 

def Person(type) 
    if type =~ /short/i 
    Short.new 
    else 
    Tall.new 
    end 
end 

pete = Person "short" 
pete.what_am_i 
=> I am short 

मैंने आवृत्ति चर के पक्ष में स्थिरता का निपटारा किया। रुबी में, वैसे भी कोई असली स्थिरांक नहीं हैं। लंबा और छोटा वर्ग बनाया जाता है और व्यक्ति को एक कन्स्ट्रक्टर विधि बनाया जाता है, जो इसके इनपुट के आधार पर टॉल या शॉर्ट क्लास देता है। इस तरह मुझे लगता है कि यह किया जाना चाहिए।

1

मैं तालिका में एक और विकल्प लाने जा रहा हूं। मैं काफी यकीन है कि क्या अपने जटिल, वास्तविक दुनिया मामले की जानकारी नहीं हूँ, इसलिए यहाँ मेरी पसंद है:

module BaseMod 
    def what_am_i 
    puts output 
    end 
end 

module Tall 
    include BaseMod 
    def self.extended klass 
    define_method :output do 
     "I am tall" 
    end 
    end 
end 

module Short 
    include BaseMod 
    def self.extended klass 
    define_method :output do 
     "I am short" 
    end 
    end 
end 

class Person 
    def initialize type 
    extend (type =~ /short/i ? Short : Tall) # Because I didn't wanna type all those lines 
    end 
end 

p = Person.new "short" 
p.what_am_i 

कृपया इस स्थिति के लिए ध्यान दें कि, तुम बस के रूप में आसानी से कर सकता है:

module Tall 
    include BaseMod 
    def output 
    "I am tall" 
    end 
end 

लेकिन मुझे नहीं पता कि क्या यह वास्तव में आपकी मदद करेगा।

+0

कि ऐसा करने का दिलचस्प तरीका:

p = Person.new "short" p.what_am_i >> I am short p = Person.new "tall" p.what_am_i >> I am tall p = Person.new "short" p.what_am_i >> I am tall 

यहाँ एक और प्रयास है। –

+0

@ BorisStitnicky जो आप बनाना चाहते हैं उसके आधार पर, एक विधि एक आवृत्ति चर से अधिक समझदार हो सकती है। वाईएमएमवी :) – Trevoke

4
module BaseMod 
    def what_am_i 
    puts self.class::OUTPUT 
    end 
end 

module Tall 
    OUTPUT = "I am tall" 
    include BaseMod 
end 

module Short 
    OUTPUT = "I am short" 
    include BaseMod 
end 

class Person 
    def initialize(type) 
    if type =~ /short/i 
     self.class.send(:include, Short) 
    else 
     self.class.send(:include, Tall) 
    end 
    end 
end 

p = Person.new "short" 
p.what_am_i 

संपादित करें: ऊपर कोड वास्तव में काम नहीं करता है:

module BaseMod 
    def self.included(base) 
    base.send(:define_method, :what_am_i) do 
     puts base::OUTPUT 
    end 
    end 
end 

module Tall 
    OUTPUT = "I am tall" 
    include BaseMod 
end 

module Short 
    OUTPUT = "I am short" 
    include BaseMod 
end 

class Person 
    def initialize type 
    if type =~ /short/i 
     extend Short 
    else 
     extend Tall 
    end 
    end 
end 

p = Person.new "short" 
p.what_am_i 
p = Person.new "tall" 
p.what_am_i 
p = Person.new "short" 
p.what_am_i 
+0

अच्छा चाल, धन्यवाद। लेकिन व्यक्तिगत रूप से, एक डिजाइन पसंद के रूप में, मैं अभी भी इस तरह के मामलों में स्थिरांक का उपयोग करने से बचाना चाहता हूं। –

+0

मैं इसे किसी भी तरह से देख सकता था। स्थिरांक टाल और लघु मॉड्यूल के परिप्रेक्ष्य से उपयुक्त हैं। निरंतर व्यक्ति के परिप्रेक्ष्य से अजीब है, लेकिन यह वह जगह नहीं है जहां what_am_i विधि वैसे भी रहना चाहिए। किसी भी मामले में, मेरा कोड सही काम नहीं करता है, इसलिए मैंने एक और समाधान जोड़ा। –

+0

मैं देखता हूं। मैंने कोशिश नहीं की, इसलिए मैंने नहीं देखा है कि यह काम नहीं करता है :) –

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