Spec-Zone.ru › Ruby 2.4

модуль PP::PPMethods

Публичные методы экземпляров

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

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

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

Удобный метод, эквивалентный следующему:

text ','
breakable
guard_inspect_key() { || ... } Показать исходный код
# File lib/pp.rb, line 133
def guard_inspect_key
  if Thread.current[:__recursive_key__] == nil
    Thread.current[:__recursive_key__] = {}.taint
  end

  if Thread.current[:__recursive_key__][:inspect] == nil
    Thread.current[:__recursive_key__][:inspect] = {}.taint
  end

  save = Thread.current[:__recursive_key__][:inspect]

  begin
    Thread.current[:__recursive_key__][:inspect] = {}.taint
    yield
  ensure
    Thread.current[:__recursive_key__][:inspect] = save
  end
end

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

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

Удобный метод, подобный #object_group, но также форматирует object_id объекта.

object_group(obj) { || ... } Показать исходный код
# File lib/pp.rb, line 196
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 168
def pop_inspect_key(id)
  Thread.current[:__recursive_key__][:inspect].delete id
end

Удаляет объект из набора объектов, которые печатаются красиво.

pp(obj) Показать исходный код
# File lib/pp.rb, line 177
def pp(obj)
  id = obj.object_id

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

  begin
    push_inspect_key(id)
    group {obj.pretty_print self}
  ensure
    pop_inspect_key(id) unless PP.sharing_detection
  end
end

Добавляет obj в буфер красивого вывода, используя Object#pretty_print или Object#pretty_print_cycle.

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

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

Красивый вывод для Hash

pp_object(obj) Показать исходный код
# File lib/pp.rb, line 255
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

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

push_inspect_key(id) Показать исходный код
# File lib/pp.rb, line 163
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 241
def seplist(list, sep=nil, iter_method=:each) # :yield: element
  sep ||= lambda { comma_breakable }
  first = true
  list.__send__(iter_method) {|*v|
    if first
      first = false
    else
      sep.call
    end
    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–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

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