带有双冒号的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
是的,这种用法完全有效。 格式只是引用常量的一种方式; 表达式解析为一个单独的常量。