IT

루비의 노드 이름으로 클래스 인스턴스를 어떻게 만듭니 까?

lottoking 2020. 8. 3. 17:29
반응형

루비의 노드 이름으로 클래스 인스턴스를 어떻게 만듭니 까?


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

어떻게 될까요?

  1. 확인하려는 클래스의 클래스로 이름이 있습니다.
  2. 내가 할 수있는 클래스 인스턴스를 인스턴스화해야한다고 생각합니다.
  3. 속성을 반복하고 인쇄하십시오.

레일에서 다음을 수행 할 수 있습니다.

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> 

Rails에서 매우 간단 : 사용 String#constantize

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

이 시도 :

Kernel.const_get("MyClass").new

그런 다음 인스턴스 변수를 반복합니다.

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

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.

참고 : https://stackoverflow.com/questions/5924495/how-do-i-create-a-class-instance-from-a-string-name-in-ruby

반응형