この Ruby コード:
income = "100"
bills = "52"
puts income - bills
エラーを投げました:
./to_f.rb:6: undefined method `-' for "100":String (NoMethodError)
文字列に対して数学演算を実行するときに、Ruby は文字列を数値に自動変換しませんか?
この Ruby コード:
income = "100"
bills = "52"
puts income - bills
エラーを投げました:
./to_f.rb:6: undefined method `-' for "100":String (NoMethodError)
文字列に対して数学演算を実行するときに、Ruby は文字列を数値に自動変換しませんか?
Ruby は、動的に型付けされ、厳密に型付けされた(または「厳密に型付けされた」) 言語です。Lua もそのような言語です。前者は、変数が任意のクラスの値を保持できることを意味します。後者は、型強制が自動的に行われないことを意味します。
これらを、動的型付けおよび緩い型付けである JavaScript と比較してください。JavaScript で書くことができ、何か役に立つvar x = [] + false;
ことをしようとします。別の例として、JavaScript"1" + 1 == "11"
では but "1" - 1 == 0
. Ruby はそのようなことはしません。
あなたの場合、必要なもの:
puts income.to_i - bills.to_i
ほとんどの演算子は Ruby ではメソッドとして実装されるため、各クラスは演算子がさまざまな型のオペランドを処理する方法を選択できることに注意してください。例えば:
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
ただし、ほとんどの場合、コア ライブラリはそれほど賢くはなりません。
文字列は + 演算子を使用して連結できるため、数値を保持する 2 つの文字列を追加するか合計するかが常に明確になるとは限りません。
数値を保持する 2 つの文字列がある場合は、計算を行う前にそれらを適切な値 (int または float) に変換します。
income = "100"
bills = "52"
puts income.to_f - bills.to_f