Ruby 2.4

PP::PPMethods

module PP::PPMethods

Public Instance Methods

check_inspect_key(id) Show source

检查object_id 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

comma_breakable() Show source

一种方便的方法,如下所示:

text ',' breakable

# File lib/pp.rb, line 212 def comma_breakable text ',' breakable end

guard_inspect_key() { || ... } Show source

产生一个块并保留前一组要打印的对象。

# 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) Show source

一种便利的方法,如#object_group,但也会重新格式化Object的object_id。

# 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(obj) { || ... } Show source

一种方便的方法,如下所示:

group(1, '#<' + obj.class.name, '>') { ... }

# File lib/pp.rb, line 196 def object_group(obj, &block) # :yield: group(1, '#<' + obj.class.name, '>', &block) end

pop_inspect_key(id) Show source

从好的打印的对象集中移除一个对象。

# File lib/pp.rb, line 168 def pop_inspect_key(id) Thread.current[:__recursive_key__][:inspect].delete id end

pp(obj) Show source

obj使用Object#pretty_print或Object#pretty_print_cycle 添加到漂亮的打印缓冲区。

对象#pretty_print_cycle在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

pp_hash(obj) Show source

A pretty print for a Hash

# 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

pp_object(obj) Show source

目前的标准故障安全可以用来打印任何给定的对象

# 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) Show source

将object_id添加id到漂亮打印的对象集合中,以便不重复对象。

# File lib/pp.rb, line 163 def push_inspect_key(id) Thread.current[:__recursive_key__][:inspect][id] = true end

seplist(list, sep=nil, iter_method=:each) { |element| ... } Show source

添加一个分隔列表。默认情况下,该列表以逗号分隔,并且有易碎空间。

seplist迭代list使用iter_method。它将每个对象产生给给seplist的块。该程序separator_proc在每个收益之间调用。

如果迭代次数为零,separator_proc则根本不调用。

如果separator_proc没有或没有给出,则使用+ lambda {#comma_breakable} +。如果iter_method没有给出,则分别使用。

例如,以下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

# 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