Книга: Программирование на языке Ruby
16.7. Объекты печати
16.7. Объекты печати
Метод inspect
(и вызывающий его метод p) предназначен для вывода объектов в виде, понятном человеку. В этом смысле он является связующим звеном между тестированием и отладкой, поэтому рассмотрение его в этой главе оправданно.
Проблема в том, что результат, формируемый методом p, бывает трудно читать. Из-за этого и появилась библиотека pp, добавляющая одноименный метод. Рассмотрим следующий искусственный пример объекта my_obj
:
class MyClass
attr_accessor :alpha, :beta, :gamma
def initialize(a,b,c)
@alpha, @beta, @gamma = a, b, с
end
end
x = MyClass.new(2, 3, 4)
y = MyClass.new(5, 6, 7)
z = MyClass.new(7, 8, 9)
my_obj = { x => y, z => [:p, :q] }
p my_obj
Вызов метода p печатает следующее:
{#<MyClass:0xb7eed86c @beta=3, @alpha=2,
@gamma=4>=>#<MyClass:0xb7eed72c @beta=6, @alpha=5, @gamma=7>,
#<MyClass:0xb7eed704 @beta=8, @alpha=7 , @gamma=9>=>[:p, :q]}
Все правильно и в общем-то даже читаемо. Но… некрасиво. А давайте затребуем библиотеку pp и воспользуемся предоставляемым ей методом pp:
require 'pp'
# ...
pp my_obj
Теперь вывод приобретает такой вид:
{#<MyClass:0xb7f7a050 @alpha=7, @beta=8, @gamma=9>=>[:p, :q],
#<MyClass:0xb7f7a1b8 @alpha=2, @beta=3, @gamma=4>=>
#<MyClass:0xb7f7a078 @alpha=5, @beta=6, @gamma=7>}
Мы получили хотя бы пробелы и разбиение на строки. Уже лучше. Но можно пойти еще дальше. Предположим, что в классе MyClass
определен специальный метод pretty_print
:
class MyClass
def pretty_print(printer)
printer.text "MyClass(#@alpha, #@beta, #@gamma)"
end
end
Аргумент printer передается вызывающей программой (или методом pp). Это аккумулятор текста, являющийся экземпляром класса PP; мы вызываем его метод text
и передаем ему текстовое представление self
. Вот что получается в результате:
{MyClass(7, 8, 9)=>[:p, :q] , MyClass(2, 3, 4)=>MyClass(5, 6, 7)}
Разумеется, можно настроить поведение по своему вкусу. Можно, например, печатать переменные экземпляра на разных строчках с отступами.
На самом деле в библиотеке pp есть много средств для подготовки ваших классов к совместной работе с методом pp. Методы object_group
, seplist
, breakable
и прочие позволяют управлять расстановкой запятых, разбиением на строки и другими способами форматирования. Дополнительную информацию можно найти в документации на сайте http://ruby-doc.org.
- Глава 17 Объекты kobject и файловая система sysfs
- Другие объекты подсистемы VFS
- ЧАСТЬ IV. База данных и ее объекты.
- Физические объекты
- Что делать, если при установке принтера появляется сообщение Невозможно завершение операции. Подсистема печати недоступн...
- При печати изображение не помещается на лист бумаги
- Объекты без прототипов
- При печати появляется сообщение об ошибке подсистемы Диспетчера очереди печати. Что делать?
- При попытке установить принтер появляется сообщение Невозможно завершение операции. Подсистема печати недоступна. В чем ...
- В Adobe Acrobat Reader русский текст на экране читается нормально, а при печати получается текст из набора символов. Как...
- Объекты базы данных
- Форматирующие объекты XSL-FO