带有双冒号的Ruby类命名约定

我知道Ruby中的::是一个范围解析运算符来访问模块和类中的方法,但使用::命名类是否合适?

 class Foo::Bar::Bee < Foo::Bar::Insect def a_method [...] end end 

如果“正确”,你的意思是语法正确 – 是的

这样做并没有什么本质上的错误,如果你在一个单独的文件中定义一个子类(例如下面的例子),那么这是一种相对常见的做法。

 # lib/foo.rb module Foo end # lib/foo/bar.rb class Foo::Bar end 

如果你不能确定父模块或类已经存在,我会避免以这种方式定义类,因为你会因为父(例如Foo )不存在而得到一个NameError 。 因此,您不会看到更多简洁模式的开源软件。

孤立地,这不起作用:

 class Foo::Bar end 

但是,这可行:

 module Foo class Bar end end 

用法完全有效。

只是要警惕这个问题:

 class Foo::Bar; end # uninitialized constant Foo (NameError) 

这样可以正常工作:

 module Foo; end class Foo::Bar; end 

是的,这种用法完全有效。 格式只是引用常量的一种方式; 表达式解析为一个单独的常量。