2011-09-16 4 views
0

Ruby를 처음 사용하기 때문에 어리석은 질문 일 수 있습니다. 예를 들어 StringFloat으로 변환하려는 경우 to_f으로 간단히 전화 할 수 있습니다.런타임시에만 알려진 유형의 캐스트 문자열입니까?

그러나 런타임시 변환 할 유형 만 알고 있다면 어떻게 될까요? 그래서 예를 들면 다음과 같이 쓸 수 있습니다 :

klass = Float 
converted = klass.from_s '10.25' 

방금 ​​찾지 못한 방법이 있습니까? 분명히 그것은 모든 것을 위해 작동하지는 않을 것이지만 적어도 기본적인 숫자 타입에 대해서는 작동하지 않을 것입니다. 당신은 단지 몇 가지 기본적인 숫자 유형을 포함 할 때문에

답변

3

이 작동합니다 :

conversions = { Float => :to_f, Fixnum => :to_i } 
klass = Float 
converted = '10.25'.send(conversions[klass]) #=> 10.25 
klass = Fixnum 
converted = '10.25'.send(conversions[klass]) #=> 10 

이 같은 Kernel#FloatKernel#Integer 방법을 사용하고 작동하는 또 다른 것은 : 그것에 대해

>> send(klass.to_s.intern, '10.25') 
=> 10.25 
>> klass = Integer 
=> Integer 
>> send(klass.to_s.intern, '10.25') 
ArgumentError: invalid value for Integer: "10.25" 
    from (irb):25:in `Integer' 
    from (irb):25:in `send' 
    from (irb):25 
    from :0 
>> send(klass.to_s.intern, '10') 
=> 10 
+0

감사합니다 - 오류를 던지기보다는 정수형으로 캐스팅을 시도 할 때 소수 자리를 잃는 것을 선호하므로 첫 번째 옵션으로갔습니다. – Russell

관련 문제