因此,在Ruby中,除了mixin之外,还可以使用Module来提供名称空间,如下所示:

module SomeNamespace
  class Animal

  end
end

animal = SomeNamespace::Animal.new

但我也看到了以下用法:

module SomeNamespace
end

class SomeNamespace::Animal

end

animal = SomeNamespace::Animal.new

我的问题是它们有什么不同(如果有),哪一个更地道?

推荐答案

不同之处在于筑巢.

在下面的示例中,您可以看到前一个使用类Foo的方法可以获得外部作用域的常量变量BAR_A,而不会出现错误.

同时,类Baz将爆炸,并出现一个未初始化常量A::B::Baz::BAR_A的错误.由于它没有隐式引入A::*,所以只有A::B::*显式引入.

module A
  BAR_A = 'Bar A!'
  module B
    BAR_B = 'Bar B!'
      class Foo
        p BAR_A
        p BAR_B
      end
  end
end

class A::B::Baz
  p BAR_A
  p BAR_B
end

这两种行为都有自己的位置.在我看来,对于哪一种是真正的Ruby方式(tm),社区中没有真正的共识.我个人大部分时间都使用前者.

Ruby相关问答推荐

while 语句的主体是块吗?

Rack并发 - rack.multithread、async.callback 或两者兼而有之?

在 Ruby 中,rescue语句可以嵌套在哪些 struct 中

get.chomp() 与 STDIN.gets.chomp() 有什么区别?

Ruby 相当于 Groovy 的 Elvis (?:) 运算符?

在一组字符串中找到最长的公共起始子字符串

Ruby 中的字符串是可变的吗?

Encoding::UndefinedConversionError

为什么在Ruby中用空格分隔的两个字符串连接在一起?

Ruby 的排序方法使用哪种算法?

在Ruby中实现平等的正确方法是什么

Sublime Text 2 控制台输入

你怎么说不等于在 Ruby 中?

获取Ruby中当前目录的父目录

不能在windows上安装thin

如何在 IRB 中重新加载脚本?

如何在 Ruby 中找到字符串中字符的索引?

如何在 Ruby 中创建整数循环?

更好的 ruby​​ markdown 解释器?

如何判断一个类是否已定义?