Ruby模块声明

时间:2013-05-13 19:46:59

标签: ruby

之间有什么区别吗?
class Bus::Driver
end

module Bus
  class Driver
  end
end

如果没有,首选哪种语法?

4 个答案:

答案 0 :(得分:7)

  

做[...]之间有什么区别吗?

唯一的区别是class Bus::Driver Bus模块必须已定义,而同样不适用于第二个。

  

首选哪种语法?

这不是一个有建设性的问题,但我个人更喜欢第二个,因为它明确指出Bus是一个模块,而第一个我看不到Bus是模块还是模块类。

答案 1 :(得分:3)

这本身就是:

class Bus::Driver
end

将导致错误NameError: uninitialized constant Bus

因此,您必须在某个时候声明class Busmodule Bus。不过每次都不一定是完整的层次结构。

我倾向于早期要求设置命名空间,然后在我的其余文件中使用更精简的形式。我不知道有任何偏好的方法 - 绝对不会让你受到批评。

答案 2 :(得分:1)

当您在项目中的多个文件中分布各种类的模块时,首选语法;并且module始终在PATH中定义gem。例如,在制作module时。

第二个更重要,应该在涉及细节时完成。 class不仅包含methods,还包含constants和{{1}}等名称空间;这很有用。

答案 3 :(得分:0)

涉及继承时,这些声明之间还有其他区别:

假设Driver继承自Person类。

class Bus::Driver < Person
end
module Bus
  class Driver < Person
  end
end

当Ruby尝试解析Person常量时,在第一个声明中它仅查找::Person。第二个同时寻找Bus::Person::Person

根据您的情况,这可能会使一个声明优于另一个声明。