2016-01-25 69 views

回答

2

不,兩者都不相同。

a.extend(B)增加模塊B的只有實例a方法,而

a = A.new.tap do |a| 
    include B 
end 

相當於

include B 

tap塊內,當前selfmain,只要你有一個模塊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" 
+1

書面答覆,並寫了同樣的事情'抽頭的塊內,當前的自我是main' ...韓元不會繼續寫作,因爲你已經做到了:) +1 –

+1

@AndreyDeinekoDziękuję! –

+1

Baller答案。謝謝。 – Fuser97381

0

includeextend同樣的事情。 include只能添加實例級方法,而延伸「包括」遠:

但也有場合,當你想包括一個模塊在一個類的類級別方法的一些方法。這是擴展方法的用處。

這僅僅是一個高層次的差異,還有更多的差異,如include在場景的限制,其中它可以工作 - 你可以read more here

+1

例如,它不回答這個問題實際上 –

-1

他們不一樣

延長是方法,如果Object類 包括爲IF模塊類

所以,如果你會做

object.extend(Module) 

您將添加方法的方法從模塊到對象,但是

SomeClass.include(Module) 

將模塊添加方法的SomeClass的

+1

它不回答問題 –

+0

btw這不是我downvoting –

+0

這被回答,之前問題被改變 – edikgat