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

时间:2014-01-10 19:14:13

标签: ruby-on-rails ruby ruby-on-rails-3.2

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

实施例

class Foo::Bar::Bee < Foo::Bar::Insect

  def a_method
    [...]
  end

end

3 个答案:

答案 0 :(得分:3)

如果“正确”,则表示语法正确 -

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

# lib/foo.rb
module Foo
end

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

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

孤立地说,这不起作用:

class Foo::Bar
end

然而,这将起作用:

module Foo
  class Bar
  end
end

答案 1 :(得分:1)

用法完全有效。

只要警惕陷阱:

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

这样可以正常工作:

module Foo; end
class Foo::Bar; end

答案 2 :(得分:0)

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