Rails项目中具有相同名称的模块和类
今天早些时候,当我跑步时,我遇到了这个问题
sidekiq
我收到以下错误:
I, [2015-09-04T12:43:33.723243 #15197] INFO -- : Celluloid 0.17.1.2 is running in BACKPORTED mode. [ http://git.io/vJf3J ] Report is not a class /home/andreydeineko/employees/app/models/report.rb:1:in `'
但Report
是没有任何拼写错误的AR类/模型。
它发生的错误是由于事实,在项目中有先前定义的模块称为Report
。
为什么同一个类和模块名称出现此问题?
是否有任何Ruby / Rails约定没有命名具有相同名称的类和模块?
您不能为Class
和Module
重用相同的名称。 在内部,Ruby模块表示为类结构,因此它们共享相同的对象空间。
此外,在定义Module / Class时,可以将名称作为常量访问。
class Report def foo p "report" end end Report => Report defined? Report => "constant"
其实你也可以写
Report = Class.new do def foo p "report" end end report = Report.new report.foo
简而言之,如果将Report
定义为Class
,则无法创建具有相同名称的Module
。
是否有任何Ruby / Rails约定没有命名具有相同名称的类和模块?
class
关键字做两件事 – 它要么创建一个新类并将其分配给给定的常量,要么根据给定的常量重新打开现有的类。 ( module
相同)
在后一种情况下,如果常量不是预期的类,它也会引发错误。 无论是模块还是其他对象都无关紧要:
Report = 123 class Report end #=> TypeError: Report is not a class