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

Ruby 在一个类中包含或继承模块的方法有多少,ruby,ruby-on-rails-4,ruby-on-rails-5,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 =

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

示例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

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


第一种称为细化。如果您没有细化
Fixnum
而只是添加了一个
#minutes
方法,那么只要您的代码被加载,
Fixnum
就会为所有使用它的人提供该方法。这可能会导致与同一方法的其他实现发生冲突(例如active record的
#minutes
),并导致模糊、难以调试的问题。相反,您可以优化
Fixnum
类,它将仅在您使用
添加优化的范围内使用该方法

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

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


第二个是在模块内确定类的范围。这不会在任何地方添加方法。正是由于搜索常量的方式,如果在当前类中找不到常量(在本例中为
VAL
),则会在树的更上层搜索该常量。其实并不是那么简单,如果你想了解更多细节,你可以阅读。

这三个例子做了非常不同的事情。你可以问这三者之间的区别是什么。另一方面,如果你只是想用不同的语法来表达相同的意思,你可以得到很多,但这有什么意义呢?我在学习如何在类中包含一个模块。每次我看到的都是不同的方式。所以我的问题是为什么有三种方式来做一件小事。。这是另一种可能性。这三件事彼此之间完全没有关系。另外,这与Rails 4有什么关系?