REPL — Read, Eval, Print, Loop — это интерактивная оболочка для языка программирования для оценки выражений в языке. REPL — отличный способ выучить язык, его синтаксис и API.
Большинство языков программирования имеют собственный REPL или созданный сообществом инструмент, написанный для той же цели. Для Ruby это IRB — интерактивная оболочка Ruby, которая позволяет вам за считанные секунды поиграть с Ruby и начать экспериментировать с его функциями.
IRB поставляется в комплекте с Ruby и может быть запущен из командной строки с помощью команды irb
. Он предоставляет историю команд, редактирование строк и выполнение программ Ruby изнутри. Однако сегодня мы не будем говорить об IRB. Вместо этого я хочу сосредоточиться на альтернативе, называемой pry , и на том, что она приносит на стол. Мы увидим некоторые изящные функции, которыми Pry обладает сегодня.
Установка
Очевидно, прежде чем мы начнем связываться с pry, нам нужно его установить. Pry — это драгоценный камень Ruby, поэтому установка его аналогична установке любого драгоценного камня Ruby. Просто введите:
gem install pry pry-doc
Мы добавили pry-doc
для доступа к документации ядра Ruby. Чтобы запустить pry, просто напечатайте pry
после установки гема.
Вы также можете сделать его частью зависимостей вашего приложения, добавив gem "pry"
pry» в Gemfile вашего приложения. Установка pry из приложения имеет свои преимущества. На самом деле, есть жемчужина pry-rails
которая заменяет консоль Rails на Pry.
Сегодня мы не будем вдаваться в жемчужину Rails, но я остановлюсь на некоторых из лучших возможностей Pry и позволю вам изучить больше самостоятельно.
Изучение документации и источника
Одной из наиболее полезных функций, доступных в Pry, является возможность изучения документации и исходного кода из оболочки. Pry делает это возможным, выбирая его из исходного кода во время выполнения. Команда для показа документации: show-doc
принимает имя метода. show-doc
будет легко работать с документацией ri и YARD , а также поддерживает подсветку и форматирование синтаксиса. Давайте начнем играть с этим.
Когда я набираю show-doc
последующим именем метода в консоли pry, документация метода возвращается непосредственно на консоль:
pry(main)> show-doc Array#map From: array.c (C Method): Owner: Array Visibility: public Signature: map() Number of lines: 12 Invokes the given block once for each element of self. Creates a new array containing the values returned by the block. See also Enumerable#collect. If no block is given, an Enumerator is returned instead. a = [ "a", "b", "c", "d" ] a.collect { |x| x + "!" } #=> ["a!", "b!", "c!", "d!"] a.map.with_index { |x, i| x * i } #=> ["", "b", "cc", "ddd"] a #=> ["a", "b", "c", "d"]
Результат не требует пояснений, он возвращает источник документации, ее подпись, количество строк и описание предоставленного метода. Вы заметите, что это метод Си, потому что я использую МРТ. Вы будете рады узнать, что основные команды Pry работают с любыми интерпретаторами, включая JRuby и Rubinius.
Таким образом, метод является частью ядра языка и написан на C, как мы могли бы понять из результата. Мы можем пойти один и посмотреть на источник этого метода прямо из pry. Просто введите show-source
и имя метода:
pry(main)> show-source Array#map From: array.c (C Method): Owner: Array Visibility: public Number of lines: 13 static VALUE rb_ary_collect(VALUE ary) { long i; VALUE collect; RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length); collect = rb_ary_new2(RARRAY_LEN(ary)); for (i = 0; i < RARRAY_LEN(ary); i++) { rb_ary_push(collect, rb_yield(RARRAY_AREF(ary, i))); } return collect; }
Вот оно Исходный код Array#map
!
Мы можем использовать show-method
или show-source
для любого доступного метода. Продолжайте, попробуйте некоторые методы, которые вы использовали.
Крючки
Следующая особенность, которую мы собираемся увидеть сегодня — это хуки. Хуки — это не что иное, как вызываемые методы, связанные с событием в Pry. Всякий раз, когда в Pry происходит событие, выполняется связанный с ним хук. У Pry уже есть некоторые события, к которым мы можем «подключиться», например :before_session
, :before_eval
и другие. Давайте посмотрим и создадим хук для одного из этих уже существующих событий:
[1] pry(main)> Pry.hooks.add_hook(:after_read, "uphook") do |text, pry| [1] pry(main)* puts text.upcase [1] pry(main)* end
Здесь мы создаем ловушку, которая запускается после того, как каждая инструкция прочитана оболочкой и выводит строку обратно, превращая ее в верхний регистр. Чтобы проверить это, мы должны начать новый сеанс Pry для загрузки ловушки:
[2] pry(main)> Pry.start # New Session is started here [1] pry(main)> "abc" "ABC" => "abc"
Как видите, он вводит заглавную строку. Это простой пример использования хуков, но вы можете извлечь из этого гораздо больше пользы. Расширения Pry часто используют их для предоставления своих замечательных функций. Более того, вы даже можете создавать свои собственные события, а впоследствии и свои собственные хуки! Узнайте больше о создании ваших собственных событий здесь
Состояние навигации
Pry предоставляет замечательную возможность просматривать объекты, переключаться между контекстами и изменять уровни, как будто это файловая система. Давайте посмотрим на пример.
Сначала мы узнаем о команде cd
. cd <OBJECT_NAME>
изменяет контекст оболочки на целевой объект, и вы можете проверить доступные методы для этого объекта или перейти на один уровень глубже:
pry(main)> class Fruit pry(main)* end pry(main)> class Apple < Fruit pry(main)* end pry(main)> self => main pry(main)> cd Fruit pry(Fruit):1> self => Fruit pry(Fruit):1> cd Apple pry(Apple):2> self => Apple
Как вы можете видеть, с каждым cd
в объекте контекст оболочки смещается к объекту, и вы можете продолжать вложение сколько угодно. Кроме того, в любое время вы можете быстро увидеть, как далеко вы вложили, и свой список вложений, используя команду nesting
.
pry(Apple):1> nesting Nesting status: -- 0. main (Pry top level) 1. Fruit 2. Apple pry(Apple):1> cd .. pry(Fruit):1> self => Fruit pry(Fruit):1> cd - pry(Apple):2> self => Apple
Подобно команде cd
Unix, чтобы добраться до родительского объекта, просто введите cd ..
и перейти к предыдущему объекту, который был посещен до того, как текущий объект использует cd -
Существуют и другие полезные команды, которые дополняют функции навигации состояния Pry, например, ls
— для отображения списка методов, модулей и многого другого. Команда find-method
используется для поиска функциональности метода и его функций. Полный набор функций команд навигации состояния задокументирован здесь
история
Еще одна полезная функция Pry — это отслеживание истории. По умолчанию, когда запускается сеанс pry, Pry записывает команды, которые вы использовали, в файле истории, который вы можете позже просмотреть, проанализировать или даже воспроизвести. Pry предлагает ряд параметров конфигурации для отслеживания истории. По умолчанию история хранится в файле /.pryhistory
, но вы можете легко изменить ее, добавив приведенное ниже в файл .pryrc
:
Pry.config.history.file = "~/.filenamehere"
Кроме того, история загружается из файла истории всякий раз, когда начинается сеанс pry, и сохраняется в файл, когда сеанс заканчивается. Однако вы можете переопределить это поведение, используя следующую конфигурацию:
# To Disable the autoload Pry.config.history.should_load = false # To enable the autosave Pry.config.history.should_save = false
Помимо непосредственной работы с файлом истории, вы также можете использовать hist
команду для hist
которая предоставляет набор флагов, которые упрощают работу с историей pry. Ввод команды hist
распечатывает всю сохраненную историю.
[9] pry(Rails):1> hist 1: hist 2: cd Rails 3: ls 4: cd Application 5: ls 6: show-method assets 7: cd .. 8: ls
Вы можете, однако, использовать флаги для дальнейшей фильтрации и проверки истории. Ниже приведены некоторые из немногих доступных флагов.
Чтобы --grep
список всех команд, которые содержат слово cd
, используйте --grep
:
[10] pry(Rails):1> hist --grep cd 2: cd Rails 4: cd Application 7: cd ..
Чтобы просмотреть последние 5 команд, которые вы использовали, используйте параметр --tail
. Число по умолчанию, если значение не передано, равно 10:
[11] pry(Rails):1> hist --tail 5 6: show-method assets 7: cd .. 8: ls 9: hist 10: hist --grep cd
В hist
интерфейсе hist
доступно больше команд, которые описаны здесь . Но я бы хотел показать вам последний крутой флаг команды hist
команд — replay
. Флаг replay
позволяет вам выполнять команды из истории, либо одну, либо диапазон команд по их номерам строк. Использование простое, просто сделайте hist --replay X..Y
:
[15] pry(main)> hist --replay 2..5 constants: API Application CommandsTasks Configuration Console ConsoleMethods Engine Html Info InfoController Initializable MailersController Paths Rack Railtie VERSION WelcomeController ActiveSupport::Autoload#methods: autoload autoload_at autoload_under autoloads eager_autoload eager_load! Rails.methods: app_class app_class= application application= backtrace_cleaner cache cache= configuration env env= gem_version groups initialize! initialized? logger logger= public_path root version instance variables: @_at_path @_autoloads @_eager_autoload @_env @_under_path @app_class @application @cache @logger @parent_name locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_ ...
Вывод
На этом мы пришли к заключению нашего урока. Pry действительно является мощной заменой стандартной IRB-оболочки и хорошо работает для улучшения существующего рабочего процесса. Мы говорили только о нескольких функциях Pry, но в них гораздо больше, в том числе пошаговая отладка (с гемом pry-debugger) и возможность редактировать и перезагружать файлы из REPL. У нас уже есть учебник, помогающий начать работу с Pry, вы можете прочитать его здесь, а также есть исчерпывающая страница документации Pry вики, которую можно найти здесь .
Спасибо за чтение, и я надеюсь, что это послужило вашим целям.