Добавить методы к уже созданному объекту?

Я знаю, как использовать include для добавления примесей в класс в 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 в мой объект.


person HippoMan    schedule 24.10.2019    source источник


Ответы (1)


Да, это возможно.

Добавить метод к экземпляру объекта

person TedTran2019    schedule 24.10.2019
comment
Спасибо. См. мое ДОПОЛНЕНИЕ к моему первоначальному вопросу/ - person HippoMan; 25.10.2019
comment
Я не хочу быть этим парнем, но на указанной странице этот метод также упоминался в одном из ответов. - person TedTran2019; 25.10.2019
comment
Там упоминалось вот что: obj.extend(AdditionalMethods). Это почти то же самое, но не совсем. Мой ответ дополняет это. (Примечание: в моем ответе есть еще один способ использования примесей). - person HippoMan; 25.10.2019