2012-01-05 5 views
0

나는 인덱스 클래스와 해시 싶습니다 (안 상징!), 다음문자열에서 클래스를 가져 오는 방법은 무엇입니까?

irb(main):015:0> class Key ;end 
=> nil 
irb(main):016:0> h={Key => "ok"} 
=> {Key=>"ok"} 

좋은처럼. (위 그림 참조)이 (물론) 실패

irb(main):017:0> str="Key" 
=> "Key" 
irb(main):018:0> h[str] 
=> nil 

그러나 : 그런 다음 문자열로, 나는이 요소를 얻을 싶어, 클래스의 이름을 부여.

그럼 내 질문 : 문자열을 실제 클래스로 변환하려면 어떻게해야합니까?

+0

가능한 중복 http://stackoverflow.com/questions/1448293/cast-between-string-and-classname) –

답변

3

당신은 Kernel#const_get를 사용할 수 있습니다

str = "Key" 
k = Kernel.const_get(str) 
val = h[k] 
-3

h[eval(str)]을 사용할 수 있습니다. eval in the Ruby 1.9.3 docs에 대한 자세한 내용

나는 이것을 날카로운 칼로 추가해야합니다.이 기법으로 스스로를 자르지 마십시오. 평가하려는 문자열에 악성 코드가 포함될 수 없도록하고 싶습니다.

+0

필요하지 않다면 사람들에게'eval'을 사용하도록 조언하지 않아야한다고 생각합니다. 이 경우에는 반드시 필요하지 않습니다. –

+0

공정한 비판,이 문제에 대한 다른 좋은 방법이 있습니다. –

6

당신은 당신이 당신이 원하는 것을 할 수있는 ActiveSupport의 "constantize"를 찾을 수 있습니다 레일을 사용하는 경우.

"String".constantize 
=> String 

하지만 비슷한 것을 할 수 있습니다.

Object.const_get("String") 
=> String 

당신은 문자열에

class String 
    def constantize 
    Object.const_get(self) 
    end 
end 

참고이를 정의 할 수 있습니다 : 당신이 정말 필요하지 않는 한 "평가를"일을 피하려고.

0

당신은 이런 식으로 작업을 수행 할 수 있습니다 (당신은 아마 eval를 사용하지 않음) :

>> class Key ;end #=> nil 
>> h={Key => "ok"} #=> {Key=>"ok"} 
>> str="Key" #=> "Key" 
>> h[Kernel.const_get(str)] #=> "ok" 
([문자열 및 클래스 이름 사이에 캐스트]의
관련 문제