2012-09-26 48 views
5

Este código Ruby:método Indefinido `-' para "100": Cadena

income = "100" 
bills = "52" 

puts income - bills 

arrojó un error:

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

¿El Ruby no auto-convertir cadenas a números al realizar operaciones matemáticas en ¿ellos?

Respuesta

13

Ruby es un dynamically-typed, strictly-typed (o "inflexible de tipos") idioma. Lua es otro de esos idiomas. Lo primero significa que las variables pueden contener cualquier clase de valor. Lo último, lo que te encuentras, significa que la coerción de tipo no ocurre automáticamente.

Contraste estos con JavaScript, que se escribe de forma dinámica y sin apretar. En JavaScript puede escribir var x = [] + false; y intento para hacer algo útil. Para otro ejemplo, en JavaScript "1" + 1 == "11" pero "1" - 1 == 0. Ruby no hará nada de eso.

En el caso de que necesite:

puts income.to_i - bills.to_i 

Tenga en cuenta que, debido a la mayor operators are implemented as methods en Ruby-cada clase puede elegir la forma en que el operador se encarga de operandos de varios tipos. Por ejemplo:

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 

La mayoría de las veces, las bibliotecas centrales no intentan ser tan ingeniosas, sin embargo.

+0

Mucho mejor que mi respuesta! Gracias, Phrogz. –

6

Como las cadenas se pueden concatenar utilizando el operador +, no siempre estará claro si desea agregar o sumar dos cadenas con valores numéricos.

Si tiene dos cadenas de números que llevan a cabo, los convierte a los valores apropiados (int o float) antes de hacer cualquier matemáticas en ellos:

income = "100" 
bills = "52" 

puts income.to_f - bills.to_f 
Cuestiones relacionadas