Использование оболочки IRB

IRB (Interactive Ruby) – это быстрый способ изучить язык программирования Ruby и проверить код, не создавая файл. IRB — это REPL, инструмент, предлагаемый многими современными языками программирования. Чтобы использовать его, нужно запустить исполняемый файл irb и ввести свой код Ruby в командную строку. Оболочка IRB оценивает введенный код и отображает результаты.

IRB предоставляет доступ ко всем встроенным функциям Ruby, а также ко всем установленным библиотекам или gem-ам. Кроме того, IRB может сохранять историю команд и даже поддерживает автозаполнение кода.

В этом мануале вы узнаете, как использовать IRB для запуска кода и проверки вывода, добавлять в IRB внешние библиотеки и настраивать сессии.

Запуск и остановка IRB

Читайте также: Установка Ruby и настройка локальной среды разработки в Ubuntu 16.04

Если вы установили Ruby, у вас уже есть доступ к IRB. Эту оболочку можно запустить на любой машине, на которой установлен Ruby. Для этого нужно ввести команду:

irb

На экране появится командная строка IRB:

irb(main):001:0>

Командная строка сообщит, что вы используете IRB и что все ваши действия будут выполняться в контексте main, который является контекстом по умолчанию в стандартной установке Ruby. Также вы увидите номер строки.

Примечание: Если вы установили Ruby с помощью RVM, командная строка может выглядеть несколько иначе и указывать номер версии:

2.4.0 :001 >

Чтобы получить командную строку как в этом руководстве, запустите IRB с помощью команды:

irb --prompt inf-ruby

IRB принимает синтаксис Ruby, который вы можете ввести в командной строке. Попробуйте сложить два числа:

2 + 2

Нажмите ENTER, и IRB посчитает результат:

=> 4

Символ => указывает, что это возвращаемое значение выражения Ruby.

Чтобы выйти из IRB, введите exit в командной строке или нажмите CTRL+D. Теперь попробуйте использовать оболочку IRB для изучения кода.

Выполнение кода в сессии IRB

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

Для примера выполните такое выражение в новой сессии IRB:

puts "Hello World"

Нажав ENTER, вы увидите такой результат:

Hello World
=> nil

Первая строка – результат метода puts, который выводит заданную строку, за которой следует разрыв строки. Метод puts выводит текст в стандартный вывод (на экран). Но метод puts, как и любой другой метод в Ruby, имеет возвращаемое значение. Метод puts возвращает nil, и именно это показывает IRB.

При выполнении любого кода командная строка изменяется, указывая номер новой строки:

Hello World
=> nil
irb(main):002:0>

Это может пригодиться в отладке кода при выполнении более сложных выражений в сессии IRB, поскольку сообщения об ошибках будут ссылаться на номера строк.

В сессии IRB можно присваивать значения переменным так же, как и в обычных программах Ruby. Выполните это выражение в сессии IRB:

birth_year = 1868

Вы увидите возвращаемое значение этого выражения:

=> 1868

Это значение присвоено переменной birth_year, но, поскольку большинство операторов Ruby возвращают значения, IRB также показывает возвращаемое значение.

Добавьте еще две переменные. Сначала создайте переменную death_year:

death_year = 1921

А затем создайте переменную age_at_death, вычитая birth_year из значения death_year.

age_at_death = death_year - birth_year

IRB присваивает значение переменной, а также показывает результат:

=> 53

В сессиях IRB не нужно использовать явный оператор puts или print, так как вы и без них увидите отображаемые возвращаемые значения.

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

Читайте также: Работа с массивами в Ruby

Следующий код Ruby использует массив sharks и метод select для фильтрации его значений (в данном случае он выведет только значения, содержащие букву «a»). Введите этот код в сессии IRB, нажимая ENTER после каждой строки:

["Tiger", "Great White", "Angel"].select do |shark|
shark.include?("a")
end

IRB позволяет вводить несколько строк кода, но он выполняет только код, который считает синтаксически завершенным. Обратите внимание, что командная строка изменяется, указывая на то, что IRB еще не обрабатывает код: для этого используется звездочка (*) и 1 вместо конечного 0.

irb(main):005:0> ["Tiger", "Great White", "Angel"].select do |shark|
irb(main):006:1*    shark.include?("a")
irb(main):007:1> end

Поскольку первая строка содержит ключевое слово do, IRB не будет выполнять код, пока не встретит ключевое слово end. Затем оболочка отобразит результат:

=> ["Great White"]

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

Использование библиотек и gem-ов

Импортировать библиотеки в сессию IRB можно с помощью оператора require, как и в обычных программах Ruby. IRB поддерживает библиотеки, которые входят в Ruby Standard Library, а также пользовательские библиотеки и gem –ы (библиотеки Ruby, распространяемые через Rubygems.org, которые устанавливаются с помощью команды gem).

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

Оператор require позволяет импортировать Net/HTTP из Ruby Standard Library. Для этого введите в IRB следующую строку кода и нажмите ENTER:

require 'net/http'

IRB указывает, что этот оператор возвращает true – это говорит о том, что библиотека была успешно загружена. Теперь введите этот код в IRB, чтобы отправить запрос на icanhazip.com для получения внешнего IP-адреса:

uri = URI.parse("http://icanhazip.com")
response = Net::HTTP.get_response uri
response.body

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

irb(main):010:0> uri = URI.parse("http://icanhazip.com")
=> #<URI::HTTP http://icanhazip.com>
irb(main):011:0> response = Net::HTTP.get_response uri
=> #<Net::HTTPOK 200 OK readbody=true>
irb(main):012:0> response.body
=> 203.0.113.52\n

Если библиотека не найдена, вы увидите другой результат. Попробуйте импортировать библиотеку HTTParty , которая упрощает работу с HTTP-запросами:

require 'httparty'

Вы увидите следующее сообщение:

LoadError: cannot load such file -- httparty

Это сообщение говорит, что заданная библиотека недоступна. HTTParty распространяется как gem, который нужно установить. Выйдите из сессии IRB (CTRL + D или exit), чтобы вернуться в стандартную командную строку. Затем используйте команду gem, чтобы установить httparty:

gem install httparty

Снова запустите irb:

irb

Попробуйте снова загрузить модуль. В сессии IRB введите этот код:

require 'httparty`

На этот раз IRB отобразит true – оболочке удалось загрузить библиотеку. Введите этот код в IRB, чтобы убедиться в этом:

response = HTTParty.get("http://icanhazip.com")
response.body

Вы увидите:

=> 203.0.113.52\n

Загрузка кода в IRB

Запуская сессию IRB с флагом -r, вы можете указать библиотеки или gem-ы, которые нужно загрузить при запуске IRB. Например, irb -r httparty запустит сессию IRB с предварительно загруженным gem-ом httparty.

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

Закройте сессию IRB (введите exit или нажмите CTRL+D).

Создайте новый файл Ruby ip_grabber.rb, определяющий объект IPGrabber с методом get, который при предоставлении URL-адреса возвращает внешний IP-адрес устройства. Можно использовать библиотеку HTTParty для получения ответа от icanhazip.com. Полученный объект IPGrabber можно применить в программе, чтобы изолировать код от внешних изменений; это позволит отключить базовую библиотеку для разрешения IP-адреса, не изменяя функций кода.

Добавьте следующий код, чтобы определить класс:

require 'httparty'
class IPGrabber
def initialize()
@url = "http://icanhazip.com"
end
def get
response = HTTParty.get(@url)
response.body.chomp  # remove the \n if it exists
end
end

Сохраните и закройте файл:

Затем запустите IRB и загрузите этот файл. Поскольку это локальный файл, а не gem или встроенная библиотека, вы должны указать путь (указывать расширение .rb не нужно).

irb -r ./ip_grabber

Загрузив сессию IRB, вы можете использовать новый объект следующим образом:

ip = IPGrabber.new
ip.get

Вы увидите такой вывод:

=> 203.0.113.52

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

Пользовательская настройка IRB

Вы можете создать конфигурационный файл .irbrc, который позволяет настроить сессию IRB. В него можно добавить поддержку автозаполнения, отступов и истории команд.

Создайте этот файл в домашнем каталоге:

nano ~/.irbrc

Сначала настройте поддержку автозаполнения. Это позволит вам использовать клавишу TAB для автозаполнения объектов, переменных и названий методов в IRB:

require 'irb/completion'

Затем добавьте поддержку сохранения истории команд во внешний файл.

IRB.conf[:SAVE_HISTORY] = 1000

После этого последние 1000 введенных вами операторов будут записаны в файл .irb_history в домашнем каталоге.

Кроме того, при запуске новой сессии IRB история будет загружаться автоматически. Вы сможете использовать клавиши со стрелками вверх и вниз для перемещения по этим записям или CTRL+R для обратного поиска, как в Bash.

Если вы хотите указать другой файл для хранения истории, добавьте его в конфигурации:

IRB.conf[:HISTORY_FILE] = '~/your_history_filename'

Затем добавьте эту строку, чтобы включить автоматическое отступы, что удобно при написании классов, методов и блоков:

IRB.conf[:AUTO_INDENT] = true

В конфигурационный файл можно добавить любой необходимый код Ruby. Это означает, что вы можете определять вспомогательные методы или загружать дополнительные библиотеки. Например, чтобы добавить history в сессию IRB, вставьте этот код в .irbrc:

def history
history_array = Readline::HISTORY.to_a
print history_array.join("\n")
end

Загрузив сессию IRB, введите history, чтобы просмотреть историю IRB. История может быть довольно большой, поэтому вы можете изменить команду history и отобразить опциональное количество строк. Замените код для функции history  этим кодом, который принимает аргумент count, и используйте его для ограничения количества отображаемых записей:

# history command
def history(count = 0)
# Get history into an array
history_array = Readline::HISTORY.to_a
# if count is > 0 we'll use it.
# otherwise set it to 0
count = count > 0 ? count : 0
if count > 0
from = hist.length - count
history_array = history_array[from..-1]
end
print history_array.join("\n")
end

Сохраните файл и запустите новую сессию IRB. Введите history 2 и вы увидите последние 2 строки истории.

Вы можете использовать файл .irbrc для загрузки библиотек, но помните, что каждая загружаемая вами библиотека увеличивает время загрузки сессии IRB. Конкретные библиотеки лучше загружать вручную с помощью require.

Заключение

IRB предоставляет возможность экспериментировать с кодом Ruby. Это отличный способ выработать логику программы перед тем, как поместить ее в файл.

Теперь вы можете использовать оболочку IRB для изучения различных типов данных Ruby.

Читайте также:

Tags: ,