Rails定义类常量时调用方法报NoMethodError问题咨询
类常量定义阶段调用自定义方法触发NoMethodError的根因
核心报错本质
方法定义的作用域和调用时的作用域完全不匹配,这是触发报错的根本原因:
- 类常量的赋值逻辑是在类定义的顶层作用域执行的,执行
CONSTANT_HERE = ...这行代码时,当前上下文的隐含调用者self就是TestingA类对象本身。也就是说,代码里直接写的get_details('example.json')调用,本质是让TestingA类对象去找自己身上有没有叫get_details的方法。 - 你代码里用
def get_details(file)定义的方法,是挂载在TestingA实例对象上的实例方法,只有通过TestingA.new生成的实例才能在自己的上下文里调用这个方法,类对象本身没有权限直接访问实例方法。
两边的作用域对不上,类对象找不到对应的方法实现,就会抛出NoMethodError (undefined method 'get_details' for TestingA:Class)的错误。
原代码的作用域错位说明
class TestingA # 执行这行赋值代码时,self 指向 TestingA 类对象,会向类对象索要 get_details 方法 CONSTANT_HERE = { details: get_details('example.json') } # 这里定义的是实例方法,仅对类的实例可见,类对象本身访问不到 def get_details(file) # 文件内容读取逻辑 end end
常见修正方向
如果需要在类常量定义阶段调用这个读取方法,只需要把方法定义调整为和调用作用域匹配的类方法,将方法挂载在类对象上即可,比如改成def self.get_details(file)的写法,类作用域内的代码就能正常调用到这个方法了。
内容的提问来源于stack exchange,提问作者Jaye Hernandez
相关产品推荐
相关产品推荐

