Как я могу вызвать «супер» из «define_method»?

Я пытаюсь добавить binding.remote_pry ко всем методам из всех классов моего приложения для тестовой среды.

Я пробую это:

classes = []
ObjectSpace.each_object { |o| classes << o if o.class == Class }
classes.each do |classe|
    classe.methods.each do |method_name|
        classe.class_eval do
            define_method(method_name.to_sym) do
                @@bindings ||= []
                @@bindings << Thread.new {binding.remote_pry}
                super
            end
        end
    end
end

Но я не знаю, как вызвать super каждого метода внутри define_method Я пытаюсь сделать что-то слишком сумасшедшее здесь? Есть другой способ? заранее спасибо


person Cassiano    schedule 02.09.2016    source источник
comment
Определенно что-то сумасшедшее. В чем проблема снова позвонить super?   -  person Sergio Tulentsev    schedule 02.09.2016
comment
К вашему сведению: classes = ObjectSpace.each_object.select { |o| o.class == Class }   -  person meagar    schedule 02.09.2016
comment
RuntimeError: неявная передача аргумента super из метода, определенного в define_method(), не поддерживается. Укажите все аргументы явно.   -  person Cassiano    schedule 02.09.2016
comment
@Cassiano Смотрите связанный дубликат. Он описывает множество способов достижения этого.   -  person meagar    schedule 02.09.2016
comment
Большое спасибо. В следующий раз буду искать усерднее.   -  person Cassiano    schedule 02.09.2016


Ответы (1)


Вы должны вызывать его с явным пустым списком аргументов, иначе super попытается передать аргументы из исходного метода, который не работает с методами, определенными define_method. Просто сделать:

super()

и тебе должно быть хорошо ;)

person katafrakt    schedule 02.09.2016
comment
Вы упустили суть, super здесь помочь не может. Это не то, как вы вызываете метод, который перезаписываете. - person meagar; 02.09.2016
comment
Ну, это отвечает на вопрос Как я могу вызвать «супер» из «define_method»? поэтому я не понимаю, как это упускает из виду. ОП получит еще одну ошибку, которая укажет ему, как достичь своей цели. но, конечно, устраивайте себе минус. - person katafrakt; 02.09.2016
comment
Вы не поможете, если вы дадите людям совет, который укажет им неправильное направление, фактически не объяснив, почему предпринятый подход не сработает. Пожалуйста, не добавляйте ответы, если вы не верите, что это действительно решит проблему. - person meagar; 02.09.2016