Ruby中能否跨类调用方法 实现账户流水逐笔显示更新后余额
跨类调用与账户流水实现方案
基础疑问解答
Ruby 完全支持跨类调用公开方法,你现有代码本身就已经在实现这个行为:Account类中实例化Transaction对象、读取Transaction实例的amount、timestamp属性,都是合法的跨类方法调用。
你无法实现累计余额的核心逻辑卡点在于:
- 单条
Transaction实例仅存储自身的金额、时间数据,不知道自己在全量交易列表中的位置,也无法获取前置交易的累计值,天然不具备计算对应时点累计余额的能力 - 你把流水打印、格式渲染的逻辑写在了
Transaction类内部,导致累计余额这种需要全局交易上下文的值根本无处获取,最终只能在输出中填死"Balance"占位字符串。
调整思路与代码实现
核心调整原则是按职责拆分类的功能:
Transaction类仅负责单条交易的原始数据存储,不处理任何格式渲染、打印逻辑- 累计余额计算、流水打印、格式对齐的逻辑全部放回
Account类——只有Account持有全量交易列表,具备遍历交易、逐笔计算累计值的上下文。
第一步:精简Transaction类
移除类内部的打印逻辑,仅保留数据存储能力:
class Transaction attr_reader :amount, :timestamp def initialize(amount) @amount = amount @timestamp = Time.now.strftime("%d/%m/%Y") end end
第二步:重构Account类的流水打印逻辑
遍历交易时逐笔累加余额,对齐你预期的输出格式:
require_relative 'transaction' class Account attr_reader :transactions def initialize @transactions = [] end def balance @transactions.sum(&:amount) end def deposit(amount) @transactions << Transaction.new(amount) end def withdraw(amount) @transactions << Transaction.new(-amount) end def print_statement # 打印表头 puts 'date || credit || debit || balance' # 按最新交易在前的顺序排列,和预期流水顺序对齐 sorted_transactions = @transactions.reverse running_balance = 0 sorted_transactions.each do |txn| running_balance += txn.amount # 拆分借贷列,正金额入credit列,负金额取绝对值入debit列 credit_str = txn.amount > 0 ? format('%.2f', txn.amount) : '' debit_str = txn.amount < 0 ? format('%.2f', txn.amount.abs) : '' # 统一格式化所有金额为两位小数,按分隔符拼接输出行 puts "#{txn.timestamp} || #{credit_str} || #{debit_str} || #{format('%.2f', running_balance)}" end end end
现有代码的其他问题修正
- 之前执行
require './lib/transaction'返回false属于正常现象:account.rb已经通过require_relative加载过Transaction类,Ruby会缓存已加载的文件,不会重复执行加载逻辑,不影响功能 - 之前
print_statement返回[nil, nil]的问题会同步解决:之前依赖Transaction#formate打印,方法内部用puts输出会返回nil,用map遍历的时候会把所有nil收集为返回数组,现在打印逻辑在Account内部用each遍历,方法会正常返回nil - 原逻辑中取款时把带负号的金额直接放入debit列不符合银行流水通用规范,调整后debit列仅展示实际支出的正数金额,和示例输出格式一致。
测试时执行原有操作(存100、取50),print_statement输出效果为:
date || credit || debit || balance 09/01/2021 || || 50.00 || 50.00 09/01/2021 || 100.00 || || 100.00完全匹配你预期的样式。
内容的提问来源于stack exchange,提问作者byronmac
相关产品推荐
相关产品推荐

