我想提出一個方法,一個Ruby模塊,使得它可以從一個類的方法或實例方法被調用,使用簡單的語法:我該如何聲明一個mixin方法,使它可以在實例方法和類方法中使用?
module MyMod
def fmt *args
args.map { | a | "You said #{a}" }
end
end
class MyClass
include MyMod
def inst
puts fmt 1,2,3
end
def self.cls
puts fmt 4,5,6
end
end
上述不起作用,因爲該類方法(cls
)無法看到實例方法fmt。如果我將定義更改爲self.fmt
,那麼實例方法必須將其調用爲MyMod.fmt
。
我希望能夠從兩種類型的方法中調用fmt (some stuff)
。有沒有一種「ruby-ish」的方式來做到這一點?我可以定義模塊爲
module MyMod
def self.fmt *args
args.map { | a | "You said #{a}" }
end
def fmt *args
MyMod.fmt args
end
end
但這不是很乾,是嗎?有一種更簡單的方法嗎?
當構建一些可以作爲其他開發人員應該包含在他們的類中的DSL時,這種回調是很好的。否則,這太神奇了,無法證明是合理的,因爲使用'include'會導致添加類方法並不明確。因此,如果這是在內部代碼中,手動使用'extend'本身幾乎總是有益的,而不是經歷記錄該特殊行爲的麻煩。 –
好點,但是如果你想在多個地方使用這個模塊,我不認爲在需要的時候同時調用'include'和'extend'是個很好的解決方案。 –
@ KL-7,爲什麼不呢?該模塊正在爲你做這個......你不必這樣做。無論如何,這是唯一的方法。 – d11wtq