包含或不包含发送的模块,有什么区别吗?

Pab*_* B. 4 ruby metaprogramming

SomeClass.include(SomeModule)
Run Code Online (Sandbox Code Playgroud)

SomeClass.send :include, SomeModule
Run Code Online (Sandbox Code Playgroud)

它们之间有什么不同吗?为什么第二种方式更受青睐?(至少我在其他人的代码中发现它更频繁).

Mik*_*wis 5

它们几乎相同.

不同之处在于,如果SomeClass#include是私有的,后者仍然可以根据其性质来调用它Object#send

如果SomeClass#include是私人的,你去了前者,它会引起错误.

因此,使用后者的优点是,无论可见性如何,您都可以包含模块.(你是否真的相信访问私有方法是"正确"的事情是另一个故事.它肯定会给你巨大的力量).