Ruby IRB - сброс всех классов

Я тренируюсь с IRB (на самом деле Wirble). Мне было интересно, может ли какой-нибудь взлом внутри IRB быть сброшен в файл для последующего распространения, редактирования и повторного использования?

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

РЕДАКТИРОВАТЬ: Чтобы уточнить исходный вопрос: я хотел бы сделать это в IRB:

class A; def m1; end; end
class A; def m2; end; end

а затем в конце дампа класса А как

class A

  def m1
  end

  def m2
  end

end

(не обязательно красивая печать кода:-))

РЕДАКТИРОВАТЬ: Re: @DGM/pry: "pry", кажется, круто, но его самоанализ кажется несколько ошибочным, и он не делает то, что ожидается. Я сделал то, что выше, и метод m1 не указан, если я использовал show-method A:

[1] pry(main)> class A; def m1; end; end     
=> nil

[2] pry(main)> class A; def m2; end; end
=> nil

[3] pry(main)> show-method A#m1
[...]
class A; def m1; end; end

[4] pry(main)> show-method A#m2
[...]
class A; def m2; end; end

[5] pry(main)> show-method A
[...]
class A; def m2; end; end

РЕДАКТИРОВАТЬ: Я подал отчет об ошибке, и @banister очень помог с проблемой pry, см. Билет, там есть очень ценные данные.

РЕДАКТИРОВАТЬ: @banister предложил использовать edit и имеет смысл следовать этому рабочему процессу.

4 ответа

Решение

В Pry, если вы создаете классы, используя edit вместо того, чтобы внутри REPL он должен работать нормально, см. следующее showterm:

http://showterm.io/434d8965312292c8830c9

Я не уверен насчет irb, но если вы используете более мощный pry, который предназначен для более мощной замены irb, вы можете сделать это:

1] pry (основной)> класс Foo [1] pry (основной)*   def bar
[1] pry(основной)*     1
[1] pry(основной)*   end
[1] pry(основной)* end
=> nil
[2] pry(main)> show-method Foo#bar

From: (pry) @ line 2: Количество строк: 3 Владелец: Foo Видимость: public

def bar
  1
end
[3] pry(main)> show-method Foo

From: (pry) @ строка 1: Количество строк: 5 класс Foo def bar 1 end end

Есть такой файл. Ознакомьтесь с ~/.irb-history:

$ irb
1.9.3p429 :001 > 2+2
 => 4
1.9.3p429 :002 > 3+3
 => 6
1.9.3p429 :003 > exit
$ tail -n 3 ~/.irb-history
2+2
3+3
exit

К сожалению, в ruby ​​нет способа сбросить источник динамически создаваемого класса. Например:

>> class Test
>>   value = rand
>>   define_method(:f) do 
?>     value
>>   end
>> end
=> #<Proc:0x007fed0b19b2c0@(irb):3 (lambda)>
>> Test.new.f
=> 0.7602337424749085
>> Test.new.f
=> 0.7602337424749085

Там нет никакого возможного способа восстановить Test Источник класса. Существуют различные гемы, которые могут получить источник метода, но они работают, читая источник из файла, в котором он находится, и не могут работать с динамически генерируемыми методами.

Единственный реальный способ достичь этого - использовать историю IRB и извлечь из нее то, что вам нужно. Этот файл находится по адресу ~/.irb-history, Может быть возможно автоматизировать это (например, извлечь определения из этого файла из текущих сеансов IRB), но я не думаю, что кто-то еще сделал это.

Другие вопросы по тегам