Spec-Zone.ru › Ruby 4.0
  1. PP::
  2. PPMethods

модуль PP::PPMethods

Модуль, определяющий вспомогательные методы для форматированного вывода.

Открытые методы экземпляра

check_inspect_key (id) Показать исходный код
# File lib/pp.rb, line 161
def check_inspect_key(id)
  recursive_state = Thread.current[:__recursive_key__] or return false
  recursive_state[:inspect]&.include?(id)
end

Проверяет, находится ли object_id id в текущем буфере объектов для форматированного вывода. Используется для разрыва циклов в цепочках объектов, выводимых в форматированном виде.

comma_breakable () Показать исходный код
# File lib/pp.rb, line 238
def comma_breakable
  text ','
  breakable
end

Вспомогательный метод, эквивалентный следующему коду:

text ','
breakable
guard_inspect_key () { || ... } Показать исходный код
# File lib/pp.rb, line 147
def guard_inspect_key
  recursive_state = Thread.current[:__recursive_key__] ||= {}.compare_by_identity
  save = recursive_state[:inspect] ||= {}.compare_by_identity
  begin
    recursive_state[:inspect] = {}.compare_by_identity
    yield
  ensure
    recursive_state[:inspect] = save
  end
end

Передаёт управление блоку и сохраняет предыдущий набор выводимых объектов.

object_address_group (obj, &block) Показать исходный код
# File lib/pp.rb, line 228
def object_address_group(obj, &block)
  str = Kernel.instance_method(:to_s).bind_call(obj)
  str.chomp!('>')
  group(1, str, '>', &block)
end

Вспомогательный метод, аналогичный object_group, но также форматирует object_id объекта.

object_group (obj) { || ... } Показать исходный код
# File lib/pp.rb, line 222
def object_group(obj, &block) # :yield:
  group(1, '#<' + obj.class.name, '>', &block)
end

Вспомогательный метод, эквивалентный следующему коду:

group(1, '#<' + obj.class.name, '>') { ... }
pop_inspect_key (id) Показать исходный код
# File lib/pp.rb, line 173
def pop_inspect_key(id)
  Thread.current[:__recursive_key__][:inspect].delete id
end

Удаляет объект из набора объектов, выводимых в форматированном виде.

pp (obj) Показать исходный код
# File lib/pp.rb, line 200
def pp(obj)
  # If obj is a Delegator then use the object being delegated to for cycle
  # detection
  obj = obj.__getobj__ if defined?(::Delegator) and ::Delegator === obj

  if check_inspect_key(obj)
    group {obj.pretty_print_cycle self}
    return
  end

  guard_inspect(obj) do
    group do
      obj.pretty_print self
    rescue NoMethodError
      text Kernel.instance_method(:inspect).bind_call(obj)
    end
  end
end

Добавляет obj в буфер форматированного вывода с помощью Object#pretty_print или Object#pretty_print_cycle.

Object#pretty_print_cycle используется, когда obj уже выведен, то есть в цепочке ссылок на объекты имеется цикл.

pp_hash (obj) Показать исходный код
# File lib/pp.rb, line 302
def pp_hash(obj)
  group(1, '{', '}') {
    seplist(obj, nil, :each_pair) {|k, v|
      group {
        pp_hash_pair k, v
      }
    }
  }
end

Форматированный вывод для Hash

pp_hash_pair (k, v) Показать исходный код
# File lib/pp.rb, line 314
def pp_hash_pair(k, v)
  if Symbol === k
    if k.inspect.match?(%r[\A:["$@!]|[%&*+\-\/<=>@\]^`|~]\z])
      k = k.to_s.inspect
    end
    text "#{k}:"
  else
    pp k
    text ' '
    text '=>'
  end
  group(1) {
    breakable
    pp v
  }
end

Форматированный вывод пары Hash

pp_object (obj) Показать исходный код
# File lib/pp.rb, line 286
def pp_object(obj)
  object_address_group(obj) {
    seplist(obj.pretty_print_instance_variables, lambda { text ',' }) {|v|
      breakable
      v = v.to_s if Symbol === v
      text v
      text '='
      group(1) {
        breakable ''
        pp(obj.instance_eval(v))
      }
    }
  }
end

Предусмотренный стандартный резервный способ форматированного вывода любого заданного Object

push_inspect_key (id) Показать исходный код
# File lib/pp.rb, line 168
def push_inspect_key(id)
  Thread.current[:__recursive_key__][:inspect][id] = true
end

Добавляет object_id id в набор объектов, выводимых в форматированном виде, чтобы не выводить объекты повторно.

seplist (list, sep=nil, iter_method=:each) { |element| ... } Показать исходный код
# File lib/pp.rb, line 267
def seplist(list, sep=nil, iter_method=:each) # :yield: element
  sep ||= lambda { comma_breakable }
  first = true
  kwsplat = EMPTY_KWHASH
  list.__send__(iter_method) {|*v|
    if first
      first = false
    else
      sep.call
    end
    kwsplat ? yield(*v, **kwsplat) : yield(*v)
  }
end

Добавляет список с разделителями. По умолчанию элементы списка разделяются запятой и пробелом с возможностью переноса строки.

seplist перебирает list с помощью iter_method. Каждый объект передаётся блоку, заданному для seplist. Между вызовами блока выполняется процедура separator_proc.

Если итерация не выполняется ни разу, separator_proc вообще не вызывается.

Если separator_proc равен nil или не задан, используется +lambda { comma_breakable }+. Если iter_method не задан, используется :each.

Например, следующие 3 фрагмента кода имеют схожий эффект.

q.seplist([1,2,3]) {|v| xxx v }

q.seplist([1,2,3], lambda { q.comma_breakable }, :each) {|v| xxx v }

xxx 1
q.comma_breakable
xxx 2
q.comma_breakable
xxx 3

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API