每次调用方法时都有一个方法更新/重新加载它自己?红宝石

时间:2015-02-09 12:55:40

标签: ruby math

我的长期目标是在ruby程序中复制this spreadsheet,然后复制到rails应用程序。

目前,我试图确定两笔债务中哪一方的利息最高,然后减去该债务的最低金额以及该人愿意支付的任何额外金额以及从另一方减去最低金额。债务。

示例:

card = balance: $10,000, Minimum: $200, i% = 20%
loan = balance: $40,000, Minimum: $400, i% = 5%
payments made per month = $1000

在这种情况下,该程序每个月首先从卡上花费600美元(1000美元 - (200美元+ 400美元)+ 200美元),直到它的余额为0然后花1000美元(1000美元 - 400美元+ 400美元),直到贷款还清并返回需要多少个月。

目前,我试图在每个月减去金额以考虑债务余额,并在调用该方法时进行此更新 - 但这似乎不起作用,两笔债务将保持400美元(snowball_amount方法)。 编辑:修复了丢失的方法问题。需要将attr_reader更改为attr_accessor 同样由于某种原因,当我将一个债务对象传递给highest_interest时,我得到一个未定义的方法'balance ='错误。将不胜感激为此提供一些帮助!

创建债务类

class Debt
  def initialize(balance: b, monthly_payment: m, annual_interest_rate: a)
    @balance = balance
    @monthly_min = monthly_payment
    @int_rate = annual_interest_rate
  end
  attr_reader :monthly_min, :balance, :int_rate
end

创建两个债务对象

@debt1 = Debt.new(balance: 14000.0, monthly_payment: 200.0, annual_interest_rate: 0.06)
@debt2 = Debt.new(balance: 40000.0, monthly_payment: 400.0, annual_interest_rate: 0.08)

将它们放入数组

@debts_array = [@debt1, @debt2]

设定每个人愿意支付的金额

@payment = 1000.0

确定支付多少额外费用,即@payment-每个债务每月最低债务,只有当债务余额超过0时

def snowball_amount
  @payments_less_mins = @payment
  @debts_array.each do |debt|
    if debt.balance <= 0
      @payments_less_mins
    elsif debt.balance > 0
      @payments_less_mins = @payments_less_mins - debt.monthly_min
    end
  end
  puts @payments_less_mins
  return @payments_less_mins
end

计算该月债务余额的方法

def compounding_interest(balance, apr)
  return balance * (1 + apr/12)**1
end

确定偿还债务需要多长时间。当债务余额高于0时,首先根据利息增加更新余额,然后从债务余额中减去最低月付款和余额中的雪球(额外金额)。然后将债务余额设为0

def highest_interest(debt, snowball)
  months_to_pay = 0
  while debt.balance > 0
    debt.balance = compounding_interest(debt.balance, debt.int_rate)
    debt.balance = debt.balance - (debt.monthly_min + snowball)
    months_to_pay += 1
  end
  debt.balance = 0
  snowball_amount
  puts months_to_pay
end

确定哪些债务具有最高余额,然后对该债务采取最高利率法。

def which_has_higher_interest
  debts_array = @debts_array.sort{|i| i.int_rate}.reverse!
  puts debts_array[0].balance
  debts_array.each do |debt|
    highest_interest(debt, snowball_amount)
  end
end

调用which_has_higher_interest方法

puts which_has_higher_interest

1 个答案:

答案 0 :(得分:1)

highest_interest方法的第3行,第4行和第7行中,您在balance=对象上调用了一个名为Debt的方法,但您的Debt个对象没有有这样的方法。您需要以某种方式定义它,可能通过更改行

attr_reader :monthly_min, :balance, :int_rate

attr_reader :monthly_min, :int_rate
attr_accessor :balance