【问题标题】:Add methods to an already-instantiated object? [duplicate]向已经实例化的对象添加方法? [复制]
【发布时间】:2020-02-20 06:33:23
【问题描述】:

我知道如何使用 include 将 mixins 添加到 Ruby 中的类中。但是,我想向 已经实例化的 对象添加一个或多个方法。这可能吗?

例如,Rack::File::Iterator 类表现为迭代器,但它不继承自 Enumerable。这意味着它不附带 reduce 方法,即使它确实包含 each 方法。

我想将reduce 方法添加到已经实例化的Rack::File::Iterator 对象(这里我将其称为“obj”),这样我就可以执行以下操作...

result = obj.reduce { |a,b| a + b }

如果我能以某种方式将include Enumerable 模块放入已经实例化的obj,我想这会实现我想要的。

我只是以Rack::File::Iterator 为例。我正在寻找一个通用的解决方案,它可以处理任何类的实例化对象。此外,我也仅以reduce 为例。我希望它适用于我可能希望添加到对象的任何方法。

是的,我知道如何编写自己的reduce 函数,我可以将obj 和一个块作为参数传递给它。但是,如果可能的话,我更愿意将这种动态 include 放入已经实例化的对象中。

提前谢谢你。

附录

我查看了下面引用的文章(谢谢!),然后我意识到还有另一种方法可以做到这一点,而该文章中没有提到。因此,我用我想到的方法为那篇文章添加了另一个答案。在这里,使用我上面概述的示例...

class << obj
  include Enumerable  # or any other module
end

这会将Enumerable 中的所有方法添加到我的对象中。

【问题讨论】:

    标签: ruby iterator instantiation mixins enumerable


    【解决方案1】:

    是的,这是可能的。

    Add method to an instanced object

    【讨论】:

    • 谢谢。请参阅我原始问题的附录/
    • 我不想成为那个人,但是在引用的页面中,其中一个答案也提到了这种方法。
    • 这里提到的是:obj.extend(AdditionalMethods)。这几乎相同,但不完全一样。我的回答补充了这一点。 (注意:我的回答是“另一种使用 mixins 的方法”)。
    猜你喜欢
    • 2010-12-25
    • 2012-09-16
    • 2014-12-22
    相关资源
    最近更新 更多