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

Rails Console创建Currency对象触发ArgumentError参数错误求助

问题根源&解决方案

兄弟,你踩了一个新手常犯的坑——把实例相关的属性和方法全定义成类级别的了!

看你的代码,所有逻辑都包在class << self里面,这意味着attr_accessor :input_value, :currency_iso是类属性(整个Currency类共用一份),而不是每个实例独有的。当你执行Currency.new(100, "CAD")时,Ruby会调用实例的initialize方法,但你既没定义实例级别的initialize,默认的initialize又不接受任何参数,所以直接抛出ArgumentError。

修正后的代码

class Currency
  # 实例属性:每个Currency对象都有自己的input_value和currency_iso
  attr_accessor :input_value, :currency_iso

  # 类常量:放在类级别没问题,所有实例共享
  USD_ISO = "USD"
  USD_TO_DM = 2.8054

  # 实例初始化方法:接收参数并赋值给当前对象的属性
  def initialize(input_value, currency_iso)
    @input_value = input_value
    @currency_iso = currency_iso
  end

  # 实例方法:对外暴露的转换接口
  def converted_value
    convert_to_dm
  end

  private

  # 私有实例方法:实际执行转换逻辑
  def convert_to_dm
    # 可以加个判断:只处理USD转DM的情况(根据你的需求调整)
    if currency_iso == USD_ISO
      input_value / USD_TO_DM
    else
      # 非USD的情况可以抛错或返回原值,按需调整
      raise "Only USD can be converted to DM"
    end
  end
end

关键修正点说明

  1. 移除class << self包裹:把属性和方法从类级别改成实例级别,让每个Currency.new出来的对象都有自己独立的属性值
  2. 添加initialize方法:明确接收两个参数,给当前实例的属性赋值
  3. 调整方法作用域:让converted_value和convert_to_dm成为实例方法,这样它们能访问当前对象的input_value和currency_iso
  4. 补充逻辑判断:给转换逻辑加了简单的合法性校验(可选,你可以根据实际需求修改)

验证效果

在rails console里执行:

c = Currency.new(100, "USD")
c.converted_value # 会返回 100 / 2.8054 的计算结果

这下就不会再报参数错误啦!

内容的提问来源于stack exchange,提问作者miner27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:11:14