做有什么区别吗
class Bus::Driver
end
和
module Bus
class Driver
end
end
如果不是,首选哪种语法?
做[...]有什么区别吗?
唯一的区别是在class Bus::Driver
模块Bus
中必须已经定义,而同样不代表第二个。
首选哪种语法?
这不是一个建设性的问题,但我个人更喜欢第二个,因为它明确指出这Bus
是一个模块,而第一个我第一眼看不到Bus
是模块还是类。
这本身:
class Bus::Driver
end
将导致错误NameError: uninitialized constant Bus
所以在某些时候你必须声明class Bus
or module Bus
。不过,它不必每次都是完整的层次结构。
我倾向于有一个早期的要求来设置命名空间,然后在我的其余文件中使用更精简的形式。我不知道有任何首选的方法 - 绝对没有任何你会受到批评的方法。
当您在项目中的多个文件中分布有各种模块类时,首选第一种语法;并且提供module
总是定义在PATH
. 例如,在制作gem
.
第二个更中心,应该在涉及细节的时候做。module
不仅包括class
,它还包括命名空间的methods
等等constants
;这是有用的。
当涉及到继承时,这些声明之间还有一个区别:
让我们假设Driver
继承自一个Person
类。
class Bus::Driver < Person
end
module Bus
class Driver < Person
end
end
当 Ruby 尝试解析Person
常量时,在第一个声明中它只查找::Person
. 第二个同时查找Bus::Person
和::Person
。
根据您的情况,这可能会使一个声明优于另一个声明。