7

做有什么区别吗

class Bus::Driver
end

module Bus
  class Driver
  end
end

如果不是,首选哪种语法?

4

4 回答 4

7

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

唯一的区别是在class Bus::Driver模块Bus必须已经定义,而同样不代表第二个。

首选哪种语法?

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

于 2013-05-13T19:51:21.150 回答
3

这本身:

class Bus::Driver
end

将导致错误NameError: uninitialized constant Bus

所以在某些时候你必须声明class Busor module Bus。不过,它不必每次都是完整的层次结构。

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

于 2013-05-13T19:51:32.770 回答
1

当您在项目中的多个文件中分布有各种模块类时,首选第一种语法;并且提供module总是定义在PATH. 例如,在制作gem.

第二个更中心,应该在涉及细节的时候做。module不仅包括class,它还包括命名空间的methods等等constants;这是有用的。

于 2013-05-13T19:53:58.923 回答
0

当涉及到继承时,这些声明之间还有一个区别:

让我们假设Driver继承自一个Person类。

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

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

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

于 2020-05-15T09:38:53.033 回答