Ruby类命名约定及双冒号用法

5

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

示例:

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

  def a_method
    [...]
  end

end
3个回答

5
如果你所说的“proper”是指语法上正确,那么是的。这样做并没有本质上的错误,如果你在一个单独的文件中定义子类(如下面的示例),那么这是一个相对常见的做法。
# 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

如果名称中的第二个常量与任何子模块或类都不相关怎么办?例如,继承类Foo::Bar::Insect中的Bar实际上不是子模块或类? - Ode
要明确的是,我不是指继承的子类,而是指命名空间的类或模块,在这种情况下它不是 Foo::Bar,而只是 Bar - coreyward

1
使用是完全有效的。 只需注意陷阱:
class Foo::Bar; end   #  uninitialized constant Foo (NameError)

这将很好地工作:

module Foo; end
class Foo::Bar; end

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接