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)

如果我在其中调用带有“-=”运算符的借记方法(如上面的类中所示),程序将失败并显示以下消息:

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()and的参数credit()是字符串,则将其转换为 int。

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

最后,我要补充一点,如果你打算@balance在方法之外设置initialize(),建议定义它的 setter 以.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 回答