2012-09-26 3 views
5

이 루비 코드 :에 수학 연산을 수행 할 때정의되지 않은 방법`- ' "100"에 대한 : 문자열

./to_f.rb:6: undefined method `-' for "100":String (NoMethodError) 
이 이

합니까 루비 번호 문자열을 자동 변환하지 :

income = "100" 
bills = "52" 

puts income - bills 

가 오류가 발생했습니다 그들?

답변

13

루비는 dynamically-typedstrictly-typed가 (또는 "강력한 형식"입니다) 언어. 루아는 또 다른 언어입니다. 전자는 변수가 모든 클래스의 값을 보유 할 수 있음을 의미합니다. 후자 - 실행중인 것은 유형 강제 변환이 자동으로 수행되지 않음을 의미합니다.

역동적으로 입력되는 JavaScript와 은 느슨하게 입력 된과 대조됩니다. JavaScript에서는 var x = [] + false;이라고 쓸 수 있으며 시도는 시도를 통해 도움이됩니다. 다른 예를 들면, "1" + 1 == "11"이지만 "1" - 1 == 0의 JavaScript입니다. 루비는 그러한 일을하지 않을 것입니다. 귀하의 경우에는

당신이 필요합니다 : 루비 각 클래스에서 operators are implemented as methods을 가장 운영자가 다양한 유형의 피연산자를 처리하는 방법을 선택할 수 있기 때문-

puts income.to_i - bills.to_i 

참고. 예를 들어 :

class Person 
    def +(something) 
    if something.is_a?(Numeric) 
     self.weight += something 
    elsif something.is_a?(Time) 
     self.age += something 
    else 
     raise "I don't know how to add a #{something.class} to a Person." 
    end 
    end 
end 

대부분의 경우 핵심 라이브러리는 너무 영리하지 않으려 고합니다.

+0

내 대답보다 훨씬 낫다! 고마워, 프로그. –

6

+ 연산자를 사용하여 문자열을 연결할 수 있기 때문에 숫자 값이 들어있는 두 문자열을 추가하거나 합칠 것인지 여부는 항상 명확하지 않습니다.

당신이 숫자를 들고 두 문자열이있는 경우, 그들에 어떤 수학을하기 전에 적절한 값 (INT 또는 플로트)로 변환 :

income = "100" 
bills = "52" 

puts income.to_f - bills.to_f 
관련 문제