Включить модуль с или без отправки, есть ли разница? - PullRequest
4 голосов
/ 12 апреля 2011
SomeClass.include(SomeModule)

против

SomeClass.send :include, SomeModule

Есть ли различия между ними?Почему второй способ предпочтительнее?(По крайней мере, я нашел это чаще в коде других людей).

Ответы [ 2 ]

5 голосов
/ 12 апреля 2011

Они почти идентичны.

Разница в том, что если SomeClass#include является частным, последний все равно сможет его вызвать из-за характера Object#send

Если бы SomeClass#include был закрытым, а вы использовали первое, это вызвало бы ошибку.

Таким образом, преимущество использования последнего заключается в том, что вы можете включать модуль независимо от его видимости.(Независимо от того, считаете ли вы на самом деле доступ к закрытым методам «правильной» вещью, это отдельная история. Это, безусловно, дает вам огромную силу).

0 голосов
/ 14 апреля 2011

Вы можете заново открыть существующий класс:

class SomeClass
  include SomeModule
end
...