Ruby'de bir dize adından nasıl sınıf örneği oluşturabilirim?


121

Bir sınıfın adına sahibim ve o sınıfın şemasında bulunan her bir rails özniteliğinde döngü yapabilmek için bu sınıfın bir örneğini oluşturmak istiyorum.

Bunu nasıl yapacağım?

  1. Adı kontrol etmek istediğim sınıfın dizesi olarak aldım
  2. Sanırım bir sınıf örneğini başlatmam gerekiyor, böylece
  3. Özniteliklerine göz atın ve bunları yazdırın.

1
Bu harika bir soru. Sorduğunuz ve beni kullanmaktan kurtardığınız için teşekkürlereval
David West

Yanıtlar:


219

Raylarda şunları yapabilirsiniz:

clazz = 'ExampleClass'.constantize

Saf yakutta:

clazz = Object.const_get('ExampleClass')

modüller ile:

module Foo
  class Bar
  end
end

kullanırdın

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

4
Unutmayın ki Object.const_get('Foo::Bar')işe yaramayacak, constantizeçalışacak.
Marc-André Lafortune

Teşekkürler, bir Yönetici :: Kullanıcı sorunu nedeniyle bunu sormak için uyandım :) Beni yenin.
mhenrixon

Hey @Wes, bu yardımcı oldu, teşekkürler! Hızlı soru - bu iç içe modüller için de işe yarar mı? Örneğin,clazz = 'Foo::Bar::Uber'
iaacp

@iaacp Evet, sahip olduğunuz iç içe geçmiş düzeyler için çalışacaktır.
Wes,


6

Bunu dene:

Kernel.const_get("MyClass").new

Ardından bir nesnenin örnek değişkenleri arasında döngü yapmak için:

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

Teşekkürler, gerçekten aktif kayıt modelinin sütunlarında dolaşmam gerektiğinden, bu benim için işe yaramayacak, ancak "saf" yakut uygulamalarımda faydalı olacak :)
mhenrixon

1
ActiveRecord # özniteliklerine () ve / veya ActiveRecord # öznitelik_namesine () göz atın.
mbreining


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"

Yakut 2.0 ve muhtemelen daha önceki sürümlerde, Object.const_getolacak yinelemeli bir arama gerçekleştirmek gibi bir ad alanlarını Foo::Bar. Yukarıdaki örnek, ad alanının önceden bilindiği ve özellikle const_getaçık olana kıyasla doğrudan modüller üzerinde çağrılabilecek gerçeği vurguladığı zamandır Object.


Buna bir açıklama eklemelisiniz. Şu an itibariyle, bu sadece bir kod bloğudur.
Josh Crozier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.