Rails项目中具有相同名称的模块和类

时间:2015-09-04 10:48:14

标签: ruby-on-rails ruby

今天早些时候,当我跑步时,我遇到了这个问题

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 `<top (required)>'

但是Report是没有任何拼写错误的AR类/模型。

发生错误的原因是,在项目中,先前已定义了名为Report的模块。

为什么同一个类和模块名称出现此问题?

是否有任何Ruby / Rails约定没有命名具有相同名称的类和模块?

2 个答案:

答案 0 :(得分:2)

您不能为ClassModule重复使用相同的名称。在内部,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

答案 1 :(得分:1)

  

是否有任何Ruby / Rails约定没有命名具有相同名称的类和模块?

class关键字执行两项操作 - 它创建一个新类并将其分配给给定的常量,或者根据给定的常量重新打开现有的类。 (module

相同

在后一种情况下,如果常量不是预期的类,它也会引发错误。无论是模块还是其他对象都无关紧要:

Report = 123

class Report
end
#=> TypeError: Report is not a class