From: Sam Duncan Date: 2012-10-09T05:47:06+09:00 Subject: Re: Undefined method `-' for nil On 10/09/2012 09:35 AM, Joz Private wrote: > class Developer > attr_accessor :name, :networth, :loans, :banks_loaned_from, :bankrupt > > def initialize(name, networth, loans, banks_loaned_from, bankrupt) > @name, @networth, @loans, @banks_loaned_from, @bankrupt = name, > networth, loans, banks_loaned_from, bankrupt > end > > def is_solvent? > if networth >= owes_amount > then true > else false > end > end > > def owes_amount > total_loans = 0 > loans_array = loans.split(',') > loans_array.each { |item| total_loans += item.to_f } > total_loans > end > > def owes_bank(bank) > loans_array = loans.split(',') > banks_array = banks_loaned_from.split(',') > banks_array.each do |item| > if bank == item > then i = banks_array.index(item) > loans_array[i].to_f > else > puts("No such bank - check name.") > end > end > end > > end > ************************************************************************** > ************************************************************************** > class Bank > attr_accessor :name, :amount_of_deposits, :amount_of_loans > > def initialize(name, amount_of_deposits, amount_of_loans) > @name, @amount_of_deposits, @amount_of_loans, = name, > amount_of_deposits, amount_of_loans > end > > def moves_loans(amount) > amount_of_loans -= amount > amount_of_deposits += (amount*0.5) > end > > def bank_is_solvent? > if amount_of_deposits >= amount_of_loans > true > else > false > end > end > > end > ************************************************************************** > ************************************************************************** > require_relative '.\Bank.rb' > require_relative '.\Developers.rb' > > class Bankrupter > > # creating the developers > L = Developer.new("L", 650000, "1500000, 500000, 1000000, 300000", > "AIB,BOI,Ulster,Anglo", false) > M = Developer.new("M", 2100000, "1400000, 2000000", "AIB,Anglo", > false) > R = Developer.new("R", 900000, "500000, 700000, 1000000, 1200000", > "AIB,BOI,RSB,Anglo", false) > MF = Developer.new("MF", 1200000, "400000, 2000000, 8000000", > "AIB,Ulster,Anglo", false) > MN = Developer.new("MN", 3000000, "100000, 300000", "BOI,RSB", false) > > # creating the banks > AIB = Bank.new("AIB", 450, 3000000, 500000, false) > Anglo = Bank.new("Anglo", 520, 5000000, 12000000, false) > BOI = Bank.new("BOI", 600, 2500000, 2500000, false) > RBS = Bank.new("RBS", 530, 2800000, 1700000, false) > Ulster = Bank.new("Ulster", 580, 2000000, 1500000, false) > > > developer_object_array = [ L, M, R, MF, MN] > bank_object_array = [ AIB, Anglo, BOI, RBS, Ulster ] > > #Now, test if they are solvent or bankrupt, and then the knock-on > effects for the banks ... > > developer_object_array.each do |dev| > if dev.is_solvent? == false > then puts("#{dev.name} is bankrupt.") > dev.bankrupt = true > bank_object_array.each do |bank| > bank.moves_loans > end > else puts("#{dev.name} is not bankrupt.") > end > end > > end > Well for a start, Bank#moves_loans method takes an 'amount' argument which you don't appear to be passing. I wouldn't be assigning your bank and developer instances to constants either (variable names starting with upper case letters are implicitly constants in Ruby). Also, the constructor for the Bank object takes 3 values, however you are passing them 5? Sam