루비의 문자열 이름으로 클래스 인스턴스를 어떻게 생성합니까?


121

클래스의 이름이 있고 해당 클래스의 스키마에있는 각 레일 속성을 반복 할 수 있도록 해당 클래스의 인스턴스를 만들고 싶습니다.

어떻게할까요?

  1. 확인하려는 클래스의 문자열로 이름이 있습니다.
  2. 내가 할 수 있도록 클래스 인스턴스를 인스턴스화해야 할 것 같아요
  3. 속성을 반복하고 인쇄하십시오.

1
이것은 좋은 질문입니다. 문의 해 주셔서 감사합니다.eval
David West

답변:


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것입니다.
Marc-André Lafortune

감사합니다. Admin :: User 문제 때문에 깨어나서 물어 보았습니다.
mhenrixon

안녕하세요 @Wes, 도움이되었습니다. 감사합니다! 빠른 질문-중첩 모듈에서도 작동합니까? 예 :clazz = 'Foo::Bar::Uber'
iaacp

@iaacp 네, 당신이 가지고있는만큼의 중첩 된 레벨에서 작동 할 것입니다.
Wes



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::Bar. 네임 스페이스가 미리 하이라이트는 사실을 알고있을 때 위의 예는 const_get직접적으로 독점적에 반대 모듈을 호출 할 수 있습니다 Object.


이에 대한 설명을 추가해야합니다. 현재로서는 코드 블록 일뿐입니다.
Josh Crozier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.