2012-09-26 23 views
5

Ten kod Ruby:Niezdefiniowany metoda `-” do "100": String

income = "100" 
bills = "52" 

puts income - bills 

zwrócił błąd:

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

Does Ruby nie automatycznej konwersji ciągów do liczb podczas wykonywania operacji matematycznych na im?

Odpowiedz

13

Ruby jest dynamically-typed, strictly-typed (lub „silnie wpisany”) język. Lua to kolejny taki język. Pierwsza oznacza, że ​​zmienne mogą zawierać dowolną klasę wartości. Ta ostatnia - na co się natkniesz - oznacza, że ​​wymuszenie typu nie następuje automatycznie.

Porównaj je z JavaScriptem, który jest wpisywany dynamicznie i luźno wpisanym. W JavaScript można napisać var x = [] + false; i będzie to próbować zrobić coś pomocnego. Dla innego przykładu, w JavaScript "1" + 1 == "11", ale "1" - 1 == 0. Ruby nic takiego nie zrobi.

W twoim przypadku trzeba:

puts income.to_i - bills.to_i 

Zauważ, że ponieważ większość operators are implemented as methods-w-Ruby każdej klasy może wybrać, w jaki sposób operator obsługuje argumenty różnych typów. Na przykład:

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 

Jednak większość bibliotek rdzenia nie próbuje być tak sprytna.

+0

Znacznie lepiej niż moja odpowiedź! Dzięki, Phrogz. –

6

Ponieważ łańcuchy mogą być łączone za pomocą operatora +, nie zawsze będzie jasne, czy chcesz dołączyć, czy zsumować dwa łańcuchy zawierające wartości liczbowe.

Jeśli masz dwa ciągi posiadających numery, konwertować je do odpowiednich wartości (int lub float) przed wykonaniem jakichkolwiek matematyki na nich:

income = "100" 
bills = "52" 

puts income.to_f - bills.to_f 
Powiązane problemy