मैं रूबी में एक स्ट्रिंग नाम से एक वर्ग उदाहरण कैसे बनाऊं?


121

मेरे पास एक वर्ग का नाम है और मैं उस वर्ग का एक उदाहरण बनाना चाहता हूं ताकि मैं प्रत्येक रेल विशेषता के माध्यम से लूप कर सकूं जो उस वर्ग के स्कीमा में मौजूद है।

मुझसे यह कैसे होगा?

  1. जिस कक्षा को मैं जाँचना चाहता हूँ, उसके नाम के रूप में मेरा नाम है
  2. मुझे लगता है कि मुझे एक वर्ग उदाहरण को तुरंत लिखने की आवश्यकता है ताकि मैं कर सकूं
  3. यह विशेषताओं के माध्यम से लूप करें और उन्हें प्रिंट करें।

1
यह एक बड़ा सवाल है। इसे पूछने और मुझे उपयोग करने से बचाने के लिए धन्यवादeval
डेविड वेस्ट

जवाबों:


219

रेल में आप बस कर सकते हैं:

clazz = 'ExampleClass'.constantize

शुद्ध रूबी में:

clazz = Object.const_get('ExampleClass')

मॉड्यूल के साथ:

module Foo
  class Bar
  end
end

आप उपयोग करेंगे

> clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c}
  => Foo::Bar 
> clazz.new
  => #<Foo::Bar:0x0000010110a4f8> 

4
ध्यान दें कि Object.const_get('Foo::Bar')काम नहीं करेगा, जबकि constantizeहोगा।
मार्क-एंड्रे लाफ्यून

धन्यवाद, जागने के बारे में पूछने के लिए कि एक व्यवस्थापक के कारण :: उपयोगकर्ता समस्या :) मुझे इसे मारो।
मिन्ह्रिक्सन

हे @Wes, यह उपयोगी था, धन्यवाद! त्वरित प्रश्न - क्या यह नेस्टेड मॉड्यूल के लिए भी काम करेगा? उदाहरण के लिए,clazz = 'Foo::Bar::Uber'
iaacp

@iaacp हाँ, यह आपके पास जितने नेस्टेड स्तर के लिए काम करेगा।
वेस

15

रेल में बहुत सरल: उपयोग करें String#constantize

class_name = "MyClass"
instance = class_name.constantize.new

6
रूबी नहीं रूबी के लिए :(
एथिकल हॉक 3

यदि आप पहले से ही रेल का उपयोग नहीं कर रहे हैं तो बेशर्मी से ActiveSupport कार्यान्वयन की प्रतिलिपि बनाएँ
edgerunner

6

इसे इस्तेमाल करे:

Kernel.const_get("MyClass").new

फिर ऑब्जेक्ट के इंस्टेंस चर के माध्यम से लूप करना:

obj.instance_variables.each do |v|
  # do something
end

धन्यवाद, क्योंकि मुझे वास्तव में सक्रिय रिकॉर्ड मॉडल के स्तंभों के माध्यम से लूप करना है जो मेरे लिए काम नहीं करेगा, लेकिन यह मेरे "शुद्ध" रूबी ऐप में उपयोगी होगा :)
mhenrixon

1
ActiveRecord # विशेषताएँ () और / या ActiveRecord # विशेषता_नाम () देखें।
18'11

बहुत बढ़िया! api.rubyonrails.org/classes/ActiveRecord/…
mhenrixon

5
module One
  module Two
    class Three
      def say_hi
        puts "say hi"
      end
    end
  end
end

one = Object.const_get "One"

puts one.class # => Module

three = One::Two.const_get "Three"

puts three.class # => Class

three.new.say_hi # => "say hi"

रूबी 2.0 और, संभवतः पहले रिलीज में, जैसे नामस्थानों पर पुनरावर्ती प्रदर्शनObject.const_get करेगा । ऊपर का उदाहरण है जब नाम स्थान समय से पहले जाना जाता है और इस तथ्य को उजागर करता है जिसे विशेष रूप से विरोध करने पर सीधे मॉड्यूल पर बुलाया जा सकता है ।Foo::Barconst_getObject


आपको इसमें स्पष्टीकरण जोड़ना चाहिए। अब तक, यह केवल कोड का एक ब्लॉक है।
जोश क्रॉजियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.