রুবিতে স্ট্রিংয়ের নাম থেকে আমি কীভাবে ক্লাস উদাহরণ তৈরি করব?


121

আমার একটি ক্লাসের নাম আছে এবং আমি সেই শ্রেণীর একটি উদাহরণ তৈরি করতে চাই যাতে আমি rail শ্রেণীর স্কিমাতে উপস্থিত প্রতিটি রেল বৈশিষ্ট্যটি লুপ করতে পারি।

আমি কীভাবে এটি করতে যাব?

  1. আমি যে ক্লাসটি যাচাই করতে চাই তার একটি স্ট্রিং হিসাবে আমার নাম রয়েছে
  2. আমার ধারণা আমার কোনও ক্লাসের উদাহরণ ইনস্ট্যান্ট করা দরকার যাতে আমি পারি can
  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হবে।
মার্ক-আন্দ্রে লাফোর্টুন

ধন্যবাদ, এডমিনের কারণে এটি সম্পর্কে জিজ্ঞাসা করতে জাগ্রত হয়েছিল: ব্যবহারকারীর ইস্যু :) আমাকে এতে মারধর করুন।
মহেনরিকসন

আরে @ ওয়েস, এটি সহায়ক ছিল, ধন্যবাদ! দ্রুত প্রশ্ন - এটিও নেস্টেড মডিউলগুলির জন্য কাজ করবে? উদাহরণস্বরূপ,clazz = 'Foo::Bar::Uber'
iaacp

@ আইএ্যাকপ হ্যাঁ, এটি আপনার যতটা নেস্টেড স্তরের পক্ষে কাজ করবে।
ওয়েস


6

এটা চেষ্টা কর:

Kernel.const_get("MyClass").new

তারপরে কোনও বস্তুর উদাহরণ ভেরিয়েবলের মধ্য দিয়ে লুপ করতে:

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

আপনাকে ধন্যবাদ, যেহেতু আমাকে সত্যই সক্রিয় রেকর্ড মডেলের কলামগুলি ভেদ করতে হবে এটি আমার পক্ষে কাজ করবে না তবে এটি আমার "খাঁটি" রুবি অ্যাপ্লিকেশনগুলিতে কার্যকর হবে :)
মেনরিক্সন

1
অ্যাক্টিভেকর্ড # বৈশিষ্ট্য () এবং / অথবা অ্যাক্টিভেকর্ড # বৈশিষ্ট্য_নাম () দেখুন।


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"

রুবি ২.০ এবং সম্ভবত সম্ভবত পূর্ববর্তী রিলিজগুলি একটি নাম স্পেসগুলিতে পুনরাবৃত্তভাবে একটি চেহারা সম্পাদনObject.const_get করবে । উপরের উদাহরণটি হ'ল যখন নেমস্পেস সময়ের আগেই জানা ছিল এবং মডিউলগুলিতে সরাসরি বলা যেতে পারে তার বিপরীতে সরাসরি কল করা যেতে পারে এমন বিষয়টিকে হাইলাইট করে ।Foo::Barconst_getObject


আপনার এটিতে একটি ব্যাখ্যা যুক্ত করা উচিত। এখন হিসাবে এটি কেবল কোডের একটি ব্লক।
জোশ ক্রোজিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.