如果我初始化這樣一個對象:是將功能擴展從做不同的水龍頭,然後包括
a = A.new
a.extend(B)
是從執行以下操作有什麼不同?
a = A.new.tap do |a|
include B
end
如果我初始化這樣一個對象:是將功能擴展從做不同的水龍頭,然後包括
a = A.new
a.extend(B)
是從執行以下操作有什麼不同?
a = A.new.tap do |a|
include B
end
不,兩者都不相同。
a.extend(B)
增加模塊B
的只有實例a
方法,而
a = A.new.tap do |a|
include B
end
相當於
include B
的tap
塊內,當前self
爲main
,只要你有一個模塊main
中,來自包含模塊的方法成爲Object
類的實例方法,如sho WN如下:
class A
def class_meth
"class meth"
end
end
module B
def module_meth
"module meth"
end
end
p Object.instance_methods
#=> [:nil?, :===, :=~, :!~,...
a = A.new.tap do |a|
include B
end
p Object.instance_methods
#=> [:module_meth, :nil?, :===, :=~,...
因此,你會覺得效果類似於a.extend(B)
,但它是更多。 任何類別的任何新對象都將通過Object
類擁有模塊B
的方法。
class C
end
p C.instance_methods
#=> [:module_meth, :nil?, :===, :=~, :!~,...
p Hash.instance_methods.grep(/module_meth/)
#=> [:module_meth]
p [].module_meth
#=> "module meth"
include
和extend
是不同樣的事情。 include
只能添加實例級方法,而延伸「包括」遠:
但也有場合,當你想包括一個模塊在一個類的類級別方法的一些方法。這是擴展方法的用處。
這僅僅是一個高層次的差異,還有更多的差異,如include
在場景的限制,其中它可以工作 - 你可以read more here。
例如,它不回答這個問題實際上 –
他們不一樣
延長是方法,如果Object類 包括爲IF模塊類
所以,如果你會做
object.extend(Module)
您將添加方法的方法從模塊到對象,但是
SomeClass.include(Module)
將模塊添加方法的SomeClass的
書面答覆,並寫了同樣的事情'抽頭的塊內,當前的自我是main' ...韓元不會繼續寫作,因爲你已經做到了:) +1 –
@AndreyDeinekoDziękuję! –
Baller答案。謝謝。 – Fuser97381