2012-09-26 13 views
5

này mã Ruby:phương pháp Undefined `-' cho "100": String

income = "100" 
bills = "52" 

puts income - bills 

ném một lỗi:

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

Liệu của Ruby không tự động chuyển đổi xâu kí tự sang số khi thực hiện các hoạt động toán học trên họ?

Trả lời

13

Ruby là một dynamically-typed, strictly-typed (hoặc "mạnh mẽ, đánh máy") ngôn ngữ. Lúa là một ngôn ngữ khác. Điều này có nghĩa là các biến có thể chứa bất kỳ lớp giá trị nào. Cái thứ hai — những gì bạn đang chạy vào — có nghĩa là sự ép buộc kiểu đó không xảy ra tự động.

Tương phản với JavaScript, được nhập động và được nhập sai. Trong JavaScript, bạn có thể viết var x = [] + false; và nó sẽ cố gắng để làm điều gì đó hữu ích. Ví dụ khác, trong JavaScript "1" + 1 == "11" nhưng "1" - 1 == 0. Ruby sẽ không làm gì cả.

Trong trường hợp của bạn, bạn cần:

puts income.to_i - bills.to_i 

Lưu ý rằng, bởi vì hầu hết operators are implemented as methods trong Ruby-mỗi lớp có thể chọn cách hành xử lý toán hạng của các loại khác nhau. Ví dụ:

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 

Hầu hết các thư viện chính không cố gắng quá thông minh.

+0

Tốt hơn nhiều so với câu trả lời của tôi! Cảm ơn, Phrogz. –

6

Vì chuỗi có thể được nối bằng toán tử +, sẽ không phải lúc nào bạn cũng muốn rõ ràng là bạn muốn chắp thêm hoặc tính tổng hai chuỗi giữ giá trị số.

Nếu bạn có hai dây giữ số, chuyển đổi chúng thành các giá trị thích hợp (int hoặc float) trước khi thực hiện bất kỳ toán trên chúng:

income = "100" 
bills = "52" 

puts income.to_f - bills.to_f