2012-11-23 56 views
4

我試圖開發一個Redmine插件,我開始閱讀documentation,並學習了很多Ruby和許多Ruby on Rails(我是一個PHP/Python/JS傢伙)瞭解Ruby on Rails發送(:包括

然後,我開始尋找通過其他插件,我發現this code我無法找到足夠的信息來充分理解這行代碼是如何工作的:

Issue.send(:include, RedmineRequireIssueAllowedToChangeAssignee::Patches::IssuePatch) 

我明白裏面IssuePatch是一些事項可以覆蓋或增加問題類。

然後我found this,解釋發送的用法,這讓我困惑,爲什麼不使用Issue.include?

主要問題是:這個方法include在哪裏定義,它有什麼作用?

UPDATE:related question

回答

7

你不能只是做include因爲它是一個私有方法,讓你用send規避紅寶石可視性控制。用send你可以調用任何方法,甚至是私有方法(就像在這種情況下)。

這個方法的定義在哪裏,它有什麼作用?

它定義爲Module#include,當與模塊作爲參數調用時,它會追加一條模塊接收器的所有實例方法(這是,你的情況,Issue類)。這是Ruby中非常常見的成語。

+0

如果接收器中的實例方法使用作爲參數傳遞的模塊中的相同名稱進行定義,會發生什麼情況? – jperelli

+0

類自己的方法將優先,模塊中的方法將以「super」的形式提供。參見[示例](http://pastie.org/5423811)。 –

+0

完美的,很好的答案。如果你願意,在答案中加入例子。謝謝! – jperelli