7

この Ruby コード:

income = "100"
bills  = "52"

puts income - bills

エラーを投げました:

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

文字列に対して数学演算を実行するときに、Ruby は文字列を数値に自動変換しませんか?

4

2 に答える 2

15

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

ただし、ほとんどの場合、コア ライブラリはそれほど賢くはなりません。

于 2012-09-26T14:42:42.483 に答える
6

文字列は + 演算子を使用して連結できるため、数値を保持する 2 つの文字列を追加するか合計するかが常に明確になるとは限りません。

数値を保持する 2 つの文字列がある場合は、計算を行う前にそれらを適切な値 (int または float) に変換します。

income = "100"
bills  = "52"

puts income.to_f - bills.to_f
于 2012-09-26T14:30:08.383 に答える