2009-10-12 4 views

답변

10

루비는 문자열을 int로 변환할지 또는 int를 문자열로 변환 할지를 모르기 때문에. 예를 들어 java 1 + "3""13"입니다. Ruby는 오류를 발생시키기 때문에 사용자가 하나의 피연산자 to_s 또는 다른 피연산자 to_i을 자동으로 결정할 수 있습니다.

+0

그래서 나는 루비의 자동 강제 변환을 기대한다. BTW python은 다음과 같이 말합니다 : "TypeError : + : 'int'와 'str'"에 대해 지원되지 않는 피연산자 유형 " –

1

당신은 .to_i 반환에게 정수 값을하고 있기 때문에, 다시 자체에 변수를 설정해야하지만, 원래 객체를 수정하지 않습니다.

>> string = "3" 
=> "3" 
>> string.class 
=> String 
>> string.to_i 
=> 3 
>> string 
=> "3" 
>> string.class 
=> String 
>> string = string.to_i 
=> 3 
>> string.class 
=> Fixnum 
+0

음, 분명합니다. –

+0

그 풍자입니까? – Garrett

5

루비가 원하는 것을 알지 못하기 때문에 오류가 발생합니다. String + fixnum은 애매한 문입니다. 문자열의 int 값과 숫자 또는 int와 문자열의 문자열 값을 추가하려고 함을 의미 할 수 있습니다. 예를 들어,

str = "5" 
num = 3 

puts str.to_i + num 
=> 8 

puts str + num.to_s 
=> 53 

루비는 사용자가 원하는 것을 추측하기보다는 예외를 throw합니다.

1

Fixnum#+은 하나의 방법 일뿐입니다. 단순화는 다음과 같이 작동

class Fixnum 
    def +(other) 
    if Fixnum === other 
     # normal operation 
    else 
     n1, n2= other.coerce(self) 
     return n1+n2 
    end 
    end 
end 

coerce가 자동으로 숫자 타입 변환에 사용됩니다. 예를 들어 42 + 3.141을 사용하는 경우이 값이 사용됩니다. 루비의 문자열은 자동으로 숫자 값으로 변환 될 수 없습니다. 이 작업을 수행하려면 String 클래스를 향상시킬 수 있습니다. 당신은이 arround를 다른 방식으로 작동하지 않습니다 이제

23 + "42" # => 65 
0.859 - "4" # => 3.141 

을 할 수

class String 
    def coerce(other) 
    coerced= case other 
    when Integer 
     self.to_i 
    when 
     self.to_f 
    end 
    return coerced, other 
    end 
end 

할 필요가있다. coerce은 숫자 값인 경우에만 "23" + 42이 작동하지 않습니다. String#+은 강요를 사용하지 않습니다.

+Fixnum으로 이루어지며, 목적으로는 Integer이 아닙니다. FixnumBignum은 내부적으로 매우 다르기 때문에 별도의 방법을 사용합니다.

관련 문제