У меня есть два класса, и я хочу скопировать все методы из одного класса в другой. У некоторых методов не будет аргументов, у некоторых будут аргументы, а у некоторых будут хэши в качестве аргументов. И я никогда не знаю заранее, какие из них будут. Поэтому я создал этот код, пока не понял, что он не учитывает аргументы. Есть ли способ получить список методов из класса, а затем точно клонировать их в другой класс?
def partial(cls)
cls.instance_methods(false).each do |method_name|
define_method(method_name) do
cls.new.method(method_name.to_sym).call
end
end
end
Методы создаются на лету с использованием define_method в первом классе, поэтому я не могу просто использовать include. В приведенном выше коде передается cls, затем он находит все методы экземпляра, которые фактически написаны в этом классе, а не те, которые он наследует, и затем создает новый метод с тем же именем. Когда этот метод вызывается, он фактически вызывает другой класс со своим методом с тем же именем. Это прекрасно работает, если у меня нет аргументов. Я проверил условие, чтобы увидеть, есть ли у него аргументы, а затем вызвал метод с аргументами, но он не очень хорошо обрабатывал хэши. Он сделал хеш в качестве массива для аргумента, а это не то, что я хотел.
Мне было интересно, существует ли простой способ буквально сказать: «Эй, вы знаете этот метод, каким бы он ни был, буквально сделать то же самое для этого другого класса».