2

私はこのクラスを持っています:

class Account
    attr_accessor :balance
    def initialize(balance)
            @balance = balance
    end
    def credit(amount)
            @balance += amount
    end
    def debit(amount)
            @balance -= amount
    end
end

次に、たとえば、プログラムの後半で次のようにします。

bank_account = Account.new(200)
bank_account.debit(100)

「-=」演算子を使用してdebitメソッドを呼び出すと(上記のクラスに示されているように)、プログラムは次のメッセージで失敗します。

bank2.rb:14:in `debit': undefined method `-' for "200":String (NoMethodError)
from bank2.rb:52:in `<main>'

しかし、マイナス記号を削除して@balance = amountにすると、機能します。明らかに減算したいのですが、なぜそれが機能しないのか理解できません。インスタンス変数で数学を行うことはできませんか?

4

3 に答える 3

3

渡される値はinitialize()整数ではなく文字列です。を介してintにキャストし.to_iます。

def initialize(balance)
   # Cast the parameter to an integer, no matter what it receives
   # and the other operators will be available to it later      
   @balance = balance.to_i
end

同様に、渡されたパラメータがdebit()文字credit()列の場合は、それをintにキャストします。

def credit(amount)
    @balance += amount.to_i
end
def debit(amount)
    @balance -= amount.to_i
end

最後に@balance、メソッドの外部で設定する場合は、暗黙的initialize()に呼び出すセッターを定義することをお勧めします。.to_i

def balance=(balance)
  @balance = balance.to_i
end

注:これは、整数値のみを使用することを想定しています。.to_f浮動小数点値が必要な場合に使用します。

于 2012-11-15T03:01:14.947 に答える
3

おそらく、あなたはしました

bank_account = Account.new("200")

あなたは実際にすべきです

bank_account = Account.new(200)
于 2012-11-15T03:02:29.657 に答える
0

で試してみてください

def credit(amount)
        @balance += amount.to_i
end
def debit(amount)
        @balance -= amount.to_i
end

またはパラメータとして数値を渡します(エラーは文字列を渡していることを示しています)

于 2012-11-15T03:01:34.447 に答える