Что такое Pry в Ruby?

Языки компьютерного программирования читают строки кода сверху вниз. Сказав это, Flow of Control позволяет программистам прервать выполнение, чтобы контролировать поток! Если вы Rubyist, вы можете еще глубже контролировать свои операторы (циклические операторы, операторы принятия решений и операторы ветвления) и функции, используя Pry.

Что оно делает?

если вы используете Pry в своем коде, он замораживает выполнение и позволяет вам исследовать ваши строки кода до точки замерзания. Взгляните на этот пример:

require "pry" # the compiler reads your code from here
a = 1
b = 2
c = a
binding.pry # but it stops here
b = c

Теперь, если вы наберете a, он вернет 1. Введите c, и он повторно запустит 1, но b по-прежнему возвращает 2, а не 1, потому что компилятор еще не достиг точки, где c было присвоено b. Это чрезвычайно полезно для целей отладки.

Но если вы новичок (каким вы всегда являетесь программистом), Pry может разочаровать при работе с некоторыми элементами управления.

Прай не пойман:

  1. Вы установили гем Pry? убедитесь, что вы делаете это с помощью команды gem install pry в терминале/командной строке.
  2. Всегда пишите require "pry" поверх кода. Одинарная или двойная кавычка не имеют большого значения.
  3. Не пишите binding.pry в последней строке исходного кода. Если это так, всегда пишите короткое выражение после, что-то простое, например puts "Testing Pry", подойдет. Если вы пробуете это в методе, вам нужно будет написать имя метода в последней строке, чтобы консоль знала, какой метод запускать в вашем файле. Чтобы запустить файл с вашего терминала, вам нужна эта команда: ruby <file name>.
  4. Если он по-прежнему не улавливает его, значит, в вашем коде есть ошибки времени компиляции (синтаксические ошибки и ошибки типа), ошибки времени компоновки (обнаруженные компоновщиком) или ошибки времени выполнения (когда программа запускается).

Чтобы исправить это, просто переместите команду binding.pry на одну строку вверх и попробуйте снова запустить файл. Если он все еще не поймал его, переместите команду binding.pry еще на одну строку вверх и продолжайте делать это, пока ваш файл не поймает binding.pry. Сделав это, вы узнаете, какие строки кода вызывают проблему.

Выход из Прай

  1. Чтобы выйти из оболочки Pry, введите !!! (3 восклицательных знака!).
  2. Избегайте использования команды exit для выхода из Pry, но используйте ее для отладки кода. Команда exit очень полезна для изучения циклов и операторов if. Вот пример:
require "pry"
arr = [1, "two", 3, 4]
arr.each do |element|
binding.pry
end

Введите element, и он вернет 1. Теперь введите exit. Вы все еще находитесь в среде Pry, потому что итерация еще не завершена. Введите element, и он вернет "two" Продолжайте вводить exit. Как только цикл достигает конца, команда exit выходит из среды Pry.

Иногда вы определяете переменную, скажем, массив, который имеет множество значений.

arr = []
1930.times { arr << "The City of Lost Heaven"}
binding.pry
prying = true # wrote this to catch the Pry

Значений 1930 много, поэтому ни exit, ни !!! в данном случае не работают. Вы можете использовать клавиши со стрелками up и down для перемещения вверх и вниз по результату, но для выхода из этого огромного количества значений нажмите q. Нажатие q не приводит к выходу из оболочки, хотя тогда вам потребуется команда !!!.

Неожиданный результат

require "pry"
def genre_count
  genres = ["rock", "rock", "jazz"]
  genre_hash = {}
  genres.each do |genre|
    if genre_hash.include?(genre) #false as genre_hash is empty
      genre_hash[genre] +=1
    else
      binding.pry
    
      genre_hash[genre] =1
    end
  end
  genre_hash
  # => {"rock"=>2, "jazz"=>1} expected output from genre_hash
end
genre_count # wrote the method name to catch the Pry

Введите жанр_хэш, и он вернет {“rock" => 2}! Подождите, разве наш код не должен читаться сверху вниз? Ну да. Тогда почему genre_hash не пусто? В данном случае binding.pry не перехватывается в течение первого раунда цикла. Введите exit, и он выйдет из Pry! Вам нужно посмотреть на символ => (в данном случае это строка 15), чтобы проверить, где вы находитесь в Pry:

...
   11:     binding.pry
   12:     else
   13:     genre_hash[genre] =1
   14:     end
=> 15:   end
   16:   genre_hash
   17: end

Это говорит о том, что binding.pry не был перехвачен до тех пор, пока if conditions не станет true

Команда exit очень полезна, чтобы копаться в Pry во время потока управления, чтобы понять, что происходит под капотом.

Совет. Если в текстовом редакторе ввести pry, а затем tap, будет написано binding.pry Экономит время, поверьте мне!

Дайте мне знать в комментариях, если вы столкнулись с какими-либо странными проблемами при использовании Pry.