做
之间有什么区别吗?class Bus::Driver
end
和
module Bus
class Driver
end
end
如果没有,首选哪种语法?
答案 0 :(得分:7)
做[...]之间有什么区别吗?
唯一的区别是class Bus::Driver
Bus
模块必须已定义,而同样不适用于第二个。
首选哪种语法?
这不是一个有建设性的问题,但我个人更喜欢第二个,因为它明确指出Bus
是一个模块,而第一个我看不到Bus
是模块还是模块类。
答案 1 :(得分:3)
这本身就是:
class Bus::Driver
end
将导致错误NameError: uninitialized constant Bus
因此,您必须在某个时候声明class Bus
或module 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
。
根据您的情况,这可能会使一个声明优于另一个声明。