2012-09-26 11 views
5

Questo codice Ruby:metodo non definito `-' per "100": String

income = "100" 
bills = "52" 

puts income - bills 

ha gettato un errore:

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

non Rubino non auto-convertire stringhe in numeri quando si eseguono operazioni matematiche su loro?

risposta

13

Ruby è un dynamically-typed, strictly-typed (o "fortemente tipizzato") linguaggio. Lua è un'altra lingua del genere. Il primo significa che le variabili possono contenere qualsiasi classe di valore. Quest'ultimo - quello che stai scontando - significa che il tipo di coercizione non avviene automaticamente.

Contrasto con JavaScript, che viene digitato in modo dinamico e con caratteri liberi. In JavaScript è possibile scrivere var x = [] + false; e sarà tentativo fare qualcosa di utile. Per un altro esempio, in JavaScript "1" + 1 == "11" ma "1" - 1 == 0. Ruby non farà nulla del genere.

Nel tuo caso è necessario:

puts income.to_i - bills.to_i 

Si noti che, perché la maggior parte operators are implemented as methods in Ruby-ogni classe può scegliere come l'operatore gestisce operandi di vario tipo. Ad esempio:

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 maggior parte delle volte le librerie principali non tentano di essere così intelligenti, comunque.

+0

Molto meglio della mia risposta! Grazie, Phrogz. –

6

Poiché le stringhe possono essere concatenate utilizzando l'operatore +, non sarà sempre chiaro se si desidera aggiungere o sommare due stringhe contenenti i valori numerici.

Se si dispone di due stringhe in possesso di numeri, convertirli in valori appropriati (int o float) prima di fare qualsiasi matematica su di loro:

income = "100" 
bills = "52" 

puts income.to_f - bills.to_f 
Problemi correlati