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

Ruby类构造函数传入hash为nil、调用each方法报错是什么原因?

错误原因
  • 你写的@my_hsh.each代码块直接定义在类作用域下,会在类加载阶段直接执行,此时还没有运行实例的初始化方法,类作用域下的@my_hsh是未赋值的类实例变量,值为nil,调用each自然会抛出nil无该方法的错误。
  • initialize方法中赋值的@my_hsh是实例级别的变量,和类作用域下的@my_hsh属于两个完全不同的变量,二者互不关联。
修复方法

把动态生成方法的逻辑挪到initialize实例初始化方法中执行即可,如果需要不同实例的动态方法互不影响,推荐使用define_singleton_method为当前实例定义单例方法,避免不同实例传参不同导致方法被覆盖的问题。

修复后完整可运行代码
# frozen_string_literal: true

class Foo
  def initialize(my_hsh = {})
    @my_hsh = my_hsh
    # 在实例初始化阶段遍历hash生成对应方法
    @my_hsh.each do |k, v|
      # 定义实例专属的单例方法,不同实例互不影响
      define_singleton_method k do
        v
      end
    end
  end
end

hsh = {
  first: 1,
  second: 2,
}
my_foo = Foo.new(hsh)
p my_foo.first # 输出 1
p my_foo.second # 输出 2

如果不需要隔离不同实例的方法,也可以将define_singleton_method替换为self.class.define_method,直接给类定义实例方法,所有该类的实例都会共享这些方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:24:02