2010-07-28 107 views
13

在什麼樣的情況是代碼:紅寶石模塊和擴展自我

module M 
    extend self 
    def greet 
    puts "hello" 
    end 

end 

更有利於用在這樣說:

module M 
    def self.greet 
    puts "hello" 
    end 
end 

在頂部,一個是一個實例方法的擴展,後者只是一個類方法,但是當調用任何一種方法時,你都必須使用M.greet,對吧?我只是好奇,是否有人可以說明何時使用一個代碼而不是另一個代碼。謝謝!

回答

13

第一個例子是通常的方式的人達到module_function功能(當他們不知道的存在這種方法)。

A module_function既是實例方法又是類方法。在你的第二個代碼示例中,該方法只是一個類方法。

+0

哦,這是一個很酷的方法。通過這種方式,您可以選擇使用哪種方法來提供功能,以防您不想將它們全部提供給它們。謝謝! – joeellis 2010-07-29 14:44:52

9

這將有可能與你的第一個例子要做到這一點,但不是你的第二個:

include M 
greet 
2

可以通過編寫模塊方法將模塊用作命名空間,並且可以將模塊的實例方法混合到另一個對象中。

自我延伸模塊概念允許模塊以兩種方式使用;無論是作爲獨立的命名空間還是作爲一個混合。考慮這個模塊:

module M 
    def bar 
    puts "bar" 
    end 
end 
class C 
    include M 
end 

它有一個實例方法,可以混入另一個對象。它沒有一個模塊的方法,不能,因此可以用作命名空間:

puts M::bar # => undefined method `bar' for M:Module 
puts C.bar # => this is bar 

但是,一個模塊是Module類的只是一個對象,因爲我們可以證明

puts M.class # => Module 

這意味着我們可以做一些瘋狂的事情。我們可以將一個模塊混合到自身中,以使其方法成爲實例和模塊方法。

module M 
    extend self 
    def bar 
    puts "bar" 
    end 
end 
puts M::bar # => this is bar 
puts C.bar # => this is bar