2010-07-23 11 views
9

निम्न उदाहरण में विफल रहता हैरूबी में स्ट्रिंग "ए :: बी :: सी" से कक्षा-वस्तु कैसे प्राप्त करूं?

class A 
    class B 
    end 
end 
p Object.const_get 'A' # => A 
p Object.const_get 'A::B' # => NameError: wrong constant name A::B 

अद्यतन

विषय पहले से पूछा के बारे में प्रश्न:

  1. Cast between String and Classname
  2. Ruby String#to_class
  3. Get a class by name in Ruby?

पिछले एक gives a nice solution जो

class String 
    def to_class 
    self.split('::').inject(Object) do |mod, class_name| 
     mod.const_get(class_name) 
    end 
    end 
end 

class A 
    class B 
    end 
end 
p "A::B".to_class # => A::B 
+0

अगर मैं उपयोग 'to_class' प्रणाली की घोषणा और एक' class', उदा के भीतर एक 'CONSTANT' लिए अपने मूल्य निर्धारित करना चाहते क्या होता है: इस यहाँ पर एक अच्छा लेख है 'कक्षा ए MY_CONST = "SomeOtherClass" .to_class end' शुरू करें? उदाहरण के लिए 'प्रारंभिक' के बाहर कॉल करते समय मुझे अनियमित स्थिरांक मिलता है। 'class_eval', मैं क्या कोशिश कर सकता हूं? धन्यवाद! – Dr1Ku

उत्तर

7

में विकसित किया जा सकता है आप मैन्युअल रूप से करना होगा "पार्स" कोलन अपने आप को और माता पिता मॉड्यूल/वर्ग पर const_get फोन:

ruby-1.9.1-p378 > class A 
ruby-1.9.1-p378 ?> class B 
ruby-1.9.1-p378 ?> end 
ruby-1.9.1-p378 ?> end 
=> nil 
ruby-1.9.1-p378 > A.const_get 'B' 
=> A::B 

किसी ने qualified_const_get लिखा है जो कि ब्याज की हो सकती है।

6

यहाँ रेल 'constantize विधि है:

def constantize(camel_cased_word) 
    names = camel_cased_word.split('::') 
    names.shift if names.empty? || names.first.empty? 

    constant = Object 
    names.each do |name| 
    constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name) 
    end 
    constant 
end 

देखें, तो यह कार्य प्रमुखता से Object पर शुरू होता है, तो डबल अर्धविराम के बीच में एक ही नाम का उपयोग एक कदम आप लगातार करने के लिए के रूप में चाहते हैं।

0

तुम भी eval साथ ऐसा कर सकते (लाइसेंस संभालने जो कुछ भी आप के लिए यह प्रयोग कर रहे हैं के साथ संगत है) जो कुछ मामलों में काम करता है जहां const_get नहीं होगा। http://blog.sidu.in/2008/02/loading-classes-from-strings-in-ruby.html#.T8j88HlYtXc

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