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