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
相关产品推荐
相关产品推荐

