Ruby实现CurrencyExchange.rate货币兑换方法功能开发求助
实现思路
核心逻辑梳理
你手里的JSON存储的是1欧元兑换对应币种的汇率,因此跨币种兑换逻辑可以简化为:
- 1单位源币种可兑换的欧元金额 = 1 / 源币种对欧元汇率
- 1单位源币种可兑换的目标币种金额 = 上述欧元金额 * 目标币种对欧元汇率
即最终公式:目标汇率 = 目标币种对欧汇率 / 源币种对欧汇率,你测试用例里的数值完全匹配这个公式:1.1403(USD对欧汇率) / 0.88598(GBP对欧汇率) = 1.287049...和测试预期完全一致。
实现建议
推荐拆分两个独立方法,符合单一职责原则,后续修改维护成本更低:
- 第一个私有辅助方法:负责从
currency_data中提取指定日期、指定币种对欧元的汇率,同时做合法性校验(日期不存在、币种不存在的场景抛出异常或者返回自定义错误) - 第二个就是你要实现的
rate公开方法,调用上述辅助方法拿到两个币种的对欧汇率,代入公式计算即可。
代码示例
require 'date' class CurrencyExchange # 假设你已经把解析后的JSON存在这个类变量里 @@currency_data = # 填入你已解析完成的currency_data变量 def self.rate(date, from_currency, to_currency) # 入参统一转格式避免符号/字符串、日期对象/字符串不匹配问题 date_str = date.iso8601 from_curr = from_currency.to_s to_curr = to_currency.to_s # 相同币种直接返回1 return 1.0 if from_curr == to_curr from_rate = get_eur_rate(date_str, from_curr) to_rate = get_eur_rate(date_str, to_curr) to_rate / from_rate end private def self.get_eur_rate(date_str, currency) # 校验日期是否存在 unless @@currency_data.key?(date_str) raise ArgumentError, "没有对应日期#{date_str}的汇率数据" end # 校验币种是否存在 unless @@currency_data[date_str].key?(currency) raise ArgumentError, "不支持的币种#{currency}" end @@currency_data[date_str][currency].to_f end end
额外优化建议
- 可以加缓存逻辑,常用的日期汇率查询结果缓存,减少重复查找成本
- 如果后续需要支持金额兑换,再新增一个单独的
convert(amount, date, from_currency, to_currency)方法,调用rate方法拿到汇率后乘以金额即可
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

