在 class 中包含或继承模块的方法有多少
How many ways to include or inherit module inside a class
我正在尝试理解在 class 中包含或继承模块的概念。每当我阅读时,我都会获得在 class 中包含或继承模块的新方法。所以只想知道有多少种方法。以下是我分享的例子:
示例 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
在这三个中,只有最后一个包含模块进入 class。也就是说,它将模块中的方法添加到 class.
第一个叫细化。如果不是优化 Fixnum
,而是向它添加一个 #minutes
方法,那么 Fixnum
将为每个使用它的人提供该方法,只要您的代码已加载。这可能会导致与同一方法的其他实现(例如活动记录的 #minutes
)发生冲突,并导致模糊、难以调试的问题。相反,您可以优化 Fixnum
class,它只会在您使用 using
.
添加优化的范围内使用该方法
它有一些问题,而且使用不是很广泛。但是出于这个问题的目的,包含模块和使用细化之间的区别是:
- including 会将方法添加到您执行包含的 class 中,而改进会使其他 classes 在使用它们的上下文中表现不同
- including 是语义的(所有对象都会有新的 include 方法),而 refinements 是词法的(关闭 class 后,如果你再次打开它,你将看不到精炼的方法)
第二个是模块内 class 的作用域。这不会在任何地方添加方法。正是由于搜索常量的方式,如果在当前 class 中找不到常量(在本例中为 VAL
),则会在树的更上层搜索。其实并没有那么简单,如果你想了解更多细节,可以阅读.
我正在尝试理解在 class 中包含或继承模块的概念。每当我阅读时,我都会获得在 class 中包含或继承模块的新方法。所以只想知道有多少种方法。以下是我分享的例子:
示例 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
在这三个中,只有最后一个包含模块进入 class。也就是说,它将模块中的方法添加到 class.
第一个叫细化。如果不是优化 Fixnum
,而是向它添加一个 #minutes
方法,那么 Fixnum
将为每个使用它的人提供该方法,只要您的代码已加载。这可能会导致与同一方法的其他实现(例如活动记录的 #minutes
)发生冲突,并导致模糊、难以调试的问题。相反,您可以优化 Fixnum
class,它只会在您使用 using
.
它有一些问题,而且使用不是很广泛。但是出于这个问题的目的,包含模块和使用细化之间的区别是:
- including 会将方法添加到您执行包含的 class 中,而改进会使其他 classes 在使用它们的上下文中表现不同
- including 是语义的(所有对象都会有新的 include 方法),而 refinements 是词法的(关闭 class 后,如果你再次打开它,你将看不到精炼的方法)
第二个是模块内 class 的作用域。这不会在任何地方添加方法。正是由于搜索常量的方式,如果在当前 class 中找不到常量(在本例中为 VAL
),则会在树的更上层搜索。其实并没有那么简单,如果你想了解更多细节,可以阅读