В IRB я могу просмотреть источник метода, который я определил ранее? - PullRequest
15 голосов
/ 25 августа 2011

Если я определю метод в IRB, есть ли способ просмотреть его источник позже в сеансе?

> def my_method
>   puts "hi"
> end

Через несколько экранов вывода я хотел бы написать что-то вроде

> source my_method

и получите обратно:

=> def my_method; puts "hi"; end;

Возможно ли это?

Ответы [ 4 ]

14 голосов
/ 25 августа 2011

Не в IRB, а в Прай эта функция встроена.

вот:

pry(main)> def hello
pry(main)*   puts "hello my friend, it's a strange world we live in"
pry(main)*   puts "yes! the rich give their mistresses tiny, illuminated dying things"
pry(main)*   puts "and life is neither sacred, nor noble, nor good"
pry(main)* end
=> nil
pry(main)> show-method hello

From: (pry) @ line 1:
Number of lines: 5

def hello
  puts "hello my friend, it's a strange world we live in"
  puts "yes! the rich give their mistresses tiny, illuminated dying things"
  puts "and life is neither sacred, nor noble, nor good"
end
pry(main)> 
14 голосов
/ 25 августа 2011

Попробуйте Прай .Об этом есть railscast (выпущенный на этой же неделе!), И он показывает, как показать код с помощью show-method.

5 голосов
/ 25 августа 2011

Если вы используете Ruby 1.9.2 и более новую версию гема sourcify , чем доступную на Rubygems.org (например, соберите исходный код из GitHub), вы можете сделать это:

>> require 'sourcify'
=> true
>> 
..   class MyMath
..     def self.sum(x, y)
..         x + y # (blah)
..       end
..   end
=> nil
>> 
..   MyMath.method(:sum).to_source
=> "def sum(x, y)\n  (x + y)\nend"
>> MyMath.method(:sum).to_raw_source
=> "def sum(x, y)\n    x + y # (blah)\n  end"

Редактировать: также проверить method_source , который pry использует внутри.

2 голосов
/ 19 апреля 2012

Я использую method_source У меня есть метод code , который по сути является моей оберткой для этого драгоценного камня. Добавьте метод method_source в приложения Gemfile для Rails. И создайте инициализатор со следующим кодом.

  # Takes instance/class, method and displays source code and comments
  def code(ints_or_clazz, method)
    method = method.to_sym
    clazz = ints_or_clazz.is_a?(Class) ? ints_or_clazz : ints_or_clazz.class
    puts "** Comments: "
    clazz.instance_method(method).comment.display
    puts "** Source:"
    clazz.instance_method(method).source.display
  end

Использование:

code Foo, :bar

или с экземпляром

code foo_instance, :bar

Лучше всего иметь класс с папкой in / lib с расширением irb, чем просто требовать в одном из инициализаторов (или создать свой собственный)

...