模块嵌套中代码样式的首选项

时间:2018-02-23 05:01:54

标签: ruby

我有点假设

module A
  module B
  end
end

module A::B
end

是相似的。 我能够从this blogthis SO threadand this SO thread找到解决方案。

为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它明显有缺点?我有一种直觉,它可能与性能有关,因为在更多名称空间中查找常量需要更多的计算。但我无法通过对普通类进行基准测试来验证这一点。

2 个答案:

答案 0 :(得分:7)

这两种写作方法经常混淆。

首先要说的是,据我所知,没有可测量的性能差异。 (以下书面例子中的一个常量查找)

最明显的差异,可能是最知名的,是您的第二个示例(module A::B要求module A在定义时存在。< / p>

除此之外,大多数人认为它们是可以互换的。那是不正确

模块只是ruby中的常量,因此适用常规常量查找。

让我以一个例子来说明:

module A
  class Test
  end

  module B
    class Show
      p Module.nesting # =>[A::B::Show, A::B, A]

      def show_action
        Test.respond_with(%q(I'm here!))
      end
    end
  end
end

另一方面,如果你通过A::B调用它,看看会发生什么:

module A
  class Test
  end
end

module A::B
  class Show
    p Module.nesting # => [A::B::Show, A::B]

    def show_action
      Test.respond_with(%q(I'm here!))
    end
  end
end

区别在于.nesting产生:

1)在第一种情况下:[A::B::Show, A::B, A](你嵌套在module A

2)在第二种情况下:[A::B::Show, A::B](此处不是)

答案 1 :(得分:1)

第一个信息比第二个信息更多。当然,在大多数情况下,您可以假设第二种形式总是可以被第一种形式取代,而不是相反。实际上,除非事先定义A,否则不能使用第二种形式。但请注意,Module#nesting的返回值在两种形式之间有所不同,因为该方法具有词法范围解释。