модуль PP::PPMethods
Module который определяет вспомогательные методы для pretty_print.
Общедоступные методы экземпляров
Исходный код
# File lib/pp.rb, line 169 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 в текущем буфере объектов, подлежащих красивой печати. Используется для разрыва циклов в цепочках объектов, подлежащих красивой печати.
Исходный код
# File lib/pp.rb, line 232 def comma_breakable text ',' breakable end
Удобный метод, который эквивалентен следующему:
text ',' breakable
Исходный код
# File lib/pp.rb, line 147
def guard_inspect_key
if Thread.current[:__recursive_key__] == nil
Thread.current[:__recursive_key__] = {}.compare_by_identity
end
if Thread.current[:__recursive_key__][:inspect] == nil
Thread.current[:__recursive_key__][:inspect] = {}.compare_by_identity
end
save = Thread.current[:__recursive_key__][:inspect]
begin
Thread.current[:__recursive_key__][:inspect] = {}.compare_by_identity
yield
ensure
Thread.current[:__recursive_key__][:inspect] = save
end
end Передает управление блоку и сохраняет предыдущий набор печатаемых объектов.
Исходный код
# File lib/pp.rb, line 222
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 объекта.
Исходный код
# File lib/pp.rb, line 216 def object_group(obj, &block) # :yield: group(1, '#<' + obj.class.name, '>', &block) end
Удобный метод, который эквивалентен следующему:
group(1, '#<' + obj.class.name, '>') { ... } Исходный код
# File lib/pp.rb, line 182 def pop_inspect_key(id) Thread.current[:__recursive_key__][:inspect].delete id end
Удаляет объект из набора объектов, подлежащих красивой печати.
Исходный код
# File lib/pp.rb, line 191
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
begin
push_inspect_key(obj)
group do
obj.pretty_print self
rescue NoMethodError
text Kernel.instance_method(:inspect).bind_call(obj)
end
ensure
pop_inspect_key(obj) unless PP.sharing_detection
end
end Добавляет obj в буфер красивой печати, используя Object#pretty_print или Object#pretty_print_cycle.
Object#pretty_print_cycle используется, когда obj уже напечатан, т.е. цепочка ссылок на объект имеет цикл.
Исходный код
# File lib/pp.rb, line 291
def pp_hash(obj)
group(1, '{', '}') {
seplist(obj, nil, :each_pair) {|k, v|
group {
pp_hash_pair k, v
}
}
}
end Красивая печать для Hash
Исходный код
# File lib/pp.rb, line 303
def pp_hash_pair(k, v)
if Symbol === k
sym_s = k.inspect
if sym_s[1].match?(/["$@!]/) || sym_s[-1].match?(/[%&*+\-\/<=>@\]^`|~]/)
text "#{k.to_s.inspect}:"
else
text "#{k}:"
end
else
pp k
text ' '
text '=>'
end
group(1) {
breakable
pp v
}
end Красивая печать для пары Hash
Исходный код
# File lib/pp.rb, line 275
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
Исходный код
# File lib/pp.rb, line 177 def push_inspect_key(id) Thread.current[:__recursive_key__][:inspect][id] = true end
Добавляет object_id id в набор печатаемых объектов, чтобы не повторять объекты.
Исходный код
# File lib/pp.rb, line 261
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
RUBY_VERSION >= "3.0" ? yield(*v, **{}) : 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–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.