2010-05-11 3 views
2

클라스이라는 클래스가 있고 이라는 클래스가 있다고 가정 해 봅시다. Klass2. 사용자의 입력에 따라, 나는 클라스에 "hello_world" 전화 할게 여부를 결정하고 싶은, 또는 Klass2 :문자열에서 클래스

class Klass 
    def self.hello_world 
    "Hello World from Klass1!" 
    end 
end 

class Klass2 
    def self.hello_world 
    "Hello World from Klass2!" 
    end 
end 

input = gets.strip 
class_to_use = input 
puts class_to_use.send :hello_world 

사용자 입력 "Klass2"하고 스크립트가 말을한다 :

안녕하세요 Klass2의 세계! 내가 문자열에 #hello_world를 호출하고있어 이후

은 물론이 코드는 작동하지 않습니다,하지만 난 Klass2#hello_world를 호출하고 싶습니다.

문자열을 Klass2 (또는 사용자가 입력 한 것)의 참조로 "변환"합니까, 아니면 어떻게하면이 동작을 얻을 수 있습니까?

답변

11
puts Object.const_get(class_to_use).hello_world 
+1

'Object.const_get' 것을 사용하는 것이 더 좋은가요? 나는 그것을 사용한 적이 없다 ... tks! :] –

1
puts eval(class_to_use).hello_world 
+7

'eval'은 항상 안전하지 않으며'const_get'에 의해 피해 갈 수 있습니다. 또한,'hello_world' 메소드를 호출 할 것이라는 것을 이미 알고 있으므로'send'를 사용할 필요가 없습니다. –

+0

왜 안전하지 않습니까? 그리고 나는'send '를 제거했다 ... 완전히 그것을 놓쳤다. 고맙습니다. –

+1

@j :'eval'은 사용자가 임의의 Ruby 코드를 실행할 수있게합니다. 그들은 수업을 선택하는 것 이상의 것을 할 수 있습니다. –

1

당신이 ActiveSupport 당신은 또한 #constantize을 사용할 수 있습니다 (레일 응용 프로그램에, 예를 들어)로드 한 경우 :

class_to_use.constantize.hello_world