2015-03-09 4 views
1

Ruby дает вам возможность отслеживать файл и строку, где метод определен во время выполнения. Так, например, если у вас есть объект с именем «OBJ», который обладает способностью вызывать метод «do_something», вы можете отслеживать его определение (в Ruby 1.9 и выше):Отслеживание определения метода Groovy?

obj.method(:do_something).source_location 

ли заводной есть любая эквивалентная возможность? Я пытаюсь найти способ определения метода, но это очень сложно.

Благодарим за помощь.

+2

Если вы просто пытаетесь определить, где определен метод, почему бы не перейти к вызову метода с помощью отладчика IDE? – jk47

+0

В моем случае intellij не войдет в них. Тем не менее, я думаю, что следующая публикация из документации Grails, вероятно, объясняет, почему «API GORM был формализован в набор классов (GormStaticApi, GormInstanceApi и GormValidationApi), которые статически подключаются к каждому классу домена на уровне байтового кода. улучшенное завершение кода для IDE, лучшая интеграция с Java и возможность более GORM-реализации для других типов хранилищ данных ». Такая магия - это то, что затрудняет устранение неполадок Rails. Печально это относится и к Grails ... Я надеялся на меньшее волшебство. – jbwiv

+0

Этот вопрос вместе с ответом может быть полезным: http://stackoverflow.com/questions/5263008/print-the-closure-definition-source-in-groovy – Opal

ответ

1

Есть ли у groovy какие-либо эквивалентные возможности?

Нет, вы не можете запрашивать объект и задать ему вопрос, как «Если я призываю сохранить метод и не передавать никаких аргументов, какой файл содержит определение для сохранения метод, который на самом деле будет вызываться и на какой номер строки это определение ». Ни язык, ни среда исполнения не предоставляют возможности для этого. Вы можете сделать некоторые вещи, например, опросить стек, чтобы узнать, откуда пришли вызовы, но это не то, что здесь задают. Я думаю, что ответ на ваш вопрос «нет».

+0

Я хотел добавить, что мы не делаем этого в Groovy главным образом потому, что мы компилируем байт-код, а байт-код Java не предоставляет эту информацию через отражение. Вы можете взломать и получить информацию, находясь в методе, выбрасывая исключение и анализируя трассировку, но этого здесь не будет, поскольку мы говорим о времени перед вызовом. – blackdrag

Смежные вопросы