在类中包含或继承模块的方法有多少

时间:2016-12-07 12:03:41

标签: ruby ruby-on-rails-4 ruby-on-rails-5

我试图理解在类中包含或继承模块的概念。每当我阅读时,我都会获得在类中包含或继承模块的新方法。所以只想知道有多少种方法。以下是我分享的例子:

示例1

module TimeExtensions
  refine Fixnum do
    def minutes; self * 60; end
  end
end

class MyApp
  using TimeExtensions

  def initialize
    p 2.minutes
  end
end

示例2

VAL = 'Global'

module Foo
  VAL = 'Foo Local'

  class Bar
    def value1
      VAL
    end
  end
end

class Foo::Bar
  def value2
    VAL
  end
end

示例3

module Foo
  def foo
    puts 'heyyyyoooo!'
  end
end

class Bar
  include Foo
end

1 个答案:

答案 0 :(得分:1)

在这三个中,只有最后一个包含一个模块进入类。也就是说,它将模块中的方法添加到类中。

第一个称为细化。如果您只是添加Fixnum方法而不是精炼#minutes,那么Fixnum将为使用它的每个人提供该方法,只要您的代码已加载。这可能会导致与同一方法的其他实现(例如活动记录的#minutes)冲突,并导致模糊,难以调试的问题。相反,您可以优化Fixnum类,它只会在您使用using添加细化的范围内使用该方法。

它有一些问题,并没有得到广泛使用。但就本问题而言,包含模块和使用细化之间的区别是:

  • 包括将方法添加到您进行包含的类中,而优化使其他类在使用它们的上下文中表现不同
  • 包括是语义的(所有对象都有新的包含方法),而改进是词法的(在关闭类后,如果再次重新打开它,你将看不到精炼的方法)

第二个是在模块中确定类的范围。这不会在任何地方添加方法。这只是由于搜索常量的方式,如果在当前类中找不到常量(在这种情况下为VAL),则在树中进一步搜索它。实际上并非如此简单,如果您想了解更多细节,可以阅读here