You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:57:04