Ruby on rails 什么';发送:包含到类和在第二个类定义中直接定义方法之间的区别是什么?

Ruby on rails 什么';发送:包含到类和在第二个类定义中直接定义方法之间的区别是什么?,ruby-on-rails,ruby,inheritance,mixins,redmine-plugins,Ruby On Rails,Ruby,Inheritance,Mixins,Redmine Plugins,最近,我不得不向Redmine的核心类添加一个方法。我无法使用继承,所以我做了如下操作: require_dependency 'time_entry_query' class TimeEntryQuery < Query def my_new_method(foo, bar) end end 在应用程序初始化的某个地方: SomeClass.send(:include, Patches::SomeClassPatch) unless SomeClass.include?

最近,我不得不向Redmine的核心类添加一个方法。我无法使用继承,所以我做了如下操作:

require_dependency 'time_entry_query'
class TimeEntryQuery < Query
    def my_new_method(foo, bar)
    end
end
在应用程序初始化的某个地方:

SomeClass.send(:include, Patches::SomeClassPatch) unless SomeClass.include? (Patches::SomeClassPatch)

这两种方法有什么区别?我应该使用哪种方法?

有两种区别:

  • 当您使用mixin时,有一个清晰的地方可以使用您的“补丁”方法。如果我想知道“嗯,这个
    my_new_method
    ”是从哪里来的,我看一下,比如说,
    TimeEntryQuery.祖先
    TimeEntryQuery.instance_method(:my_new_method).owner
    ,它将返回
    Patches::SomeClassPatch
    。所以我知道我必须在某个地方寻找一个名为
    lib/patches/some_class\u patch.rb
    的文件,以找到它可能的定义位置。(我也可以尝试
    source\u location
    ,但这并不总是可靠的。)

  • 将模块混合到类中会使模块成为它要混合到的类的超类。因此,如果在
    TimeEntryQuery
    中已经定义了
    my\u new\u方法
    ,您的第一个选项将覆盖它,而在第二个选项中,您的方法将成为该方法的
    super
    方法。IOW:使用第二个选项,除非已经存在的方法调用
    super
    ,否则不会调用新方法


  • 第二个例子是Ruby动态编程行为。。
    SomeClass.send(:include, Patches::SomeClassPatch) unless SomeClass.include? (Patches::SomeClassPatch)