Можно ли заставить ruby ​​напечатать исходный код для динамического метода? - PullRequest
6 голосов
/ 08 апреля 2011

Я исследовал получение исходного кода метода , если он существует в виде файла, но без этой ссылки на файл, возможно ли динамически печатать исходный код метода? Кажется, я могу получить доступ к сигнатурам метода в классе с помощью self.methods и каждого метода .arity. Я считаю, что драгоценный камень ri_for относится к исходному файлу.

Лучший способ сформулировать этот вопрос: если класс расширяется во время выполнения, безопасен ли его источник для исследования? Или возможность исследования ограничена сигнатурой метода и именами переменных экземпляра, может быть, переменными класса?

Редактировать: Решение, которое я использовал: http://seattlerb.rubyforge.org/svn/ruby2ruby/1.2.1/lib/ruby2ruby.rb

class Ruby2Ruby < SexpProcessor  
  def self.translate(klass_or_str, method = nil)  
    sexp = ParseTree.translate(klass_or_str, method)  
    unifier = Unifier.new  
    unifier.processors.each do |p|  
      p.unsupported.delete :cfunc  
    end  
    sexp = unifier.process(sexp)  
    self.new.process(sexp)  
  end   
end  

class Module  
  def to_ruby  
    Ruby2Ruby.translate(self)  
  end  
end  

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

Ответы [ 2 ]

5 голосов
/ 08 апреля 2011

Говорили о Proc#to_source методе МРТ, но AFAIK ничего не вышло (пока).Тем не менее, есть драгоценный камень sourcify, вы должны посмотреть, соответствует ли он вашим потребностям:

https://github.com/ngty/sourcify

2 голосов
/ 08 апреля 2011

Если класс расширяется во время выполнения, является ли его источник безопасным для исследования?

Нет, это не безопасно.Например, ParseTree может использоваться для определения фактического кода времени выполнения для метода и обратного инжиниринга эквивалентной реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...