模組 PP::PPMethods
公開實例方法
check_inspect_key(id) 按一下以切換來源
檢查物件 ID id
是否在要漂亮列印的物件目前緩衝區中。用於中斷要漂亮列印的物件鏈中的循環。
# File lib/pp.rb, line 167 def check_inspect_key(id) Thread.current[:__recursive_key__] && Thread.current[:__recursive_key__][:inspect] && Thread.current[:__recursive_key__][:inspect].include?(id) end
comma_breakable() 按一下以切換來源
一個便利的方法,與下列相同
text ',' breakable
# File lib/pp.rb, line 226 def comma_breakable text ',' breakable end
guard_inspect_key() { || ... } 按一下以切換來源
讓區塊執行,並保留先前列印的物件集。
# File lib/pp.rb, line 145 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
object_address_group(obj, &block) 按一下以切換來源
一個便利的方法,類似於 object_group
,但也會重新格式化物件的物件 ID。
# File lib/pp.rb, line 216 def object_address_group(obj, &block) str = Kernel.instance_method(:to_s).bind_call(obj) str.chomp!('>') group(1, str, '>', &block) end
object_group(obj) { || ... } 按一下以切換來源
一個便利的方法,與下列相同
group(1, '#<' + obj.class.name, '>') { ... }
# File lib/pp.rb, line 210 def object_group(obj, &block) # :yield: group(1, '#<' + obj.class.name, '>', &block) end
pop_inspect_key(id) 按一下以切換來源
從要漂亮列印的物件集中移除一個物件。
# File lib/pp.rb, line 180 def pop_inspect_key(id) Thread.current[:__recursive_key__][:inspect].delete id end
pp(obj) 按一下以切換來源
使用 Object#pretty_print 或 Object#pretty_print_cycle 將 obj
新增到漂亮列印緩衝區中。
當 obj
已列印時,會使用 Object#pretty_print_cycle,亦即物件參考鏈中有循環。
# File lib/pp.rb, line 189 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 obj.is_a?(::Delegator) if check_inspect_key(obj) group {obj.pretty_print_cycle self} return end begin push_inspect_key(obj) group {obj.pretty_print self} ensure pop_inspect_key(obj) unless PP.sharing_detection end end
pp_hash(obj) 按一下以切換來源
一個 Hash
的漂亮列印
# File lib/pp.rb, line 285 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) 按一下以切換來源
漂亮列印任何給定的 Object
的目前標準安全防護措施
# File lib/pp.rb, line 269 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) 按一下以切換來源
將物件 ID id
新增到要漂亮列印的物件集中,以避免重複列印物件。
# File lib/pp.rb, line 175 def push_inspect_key(id) Thread.current[:__recursive_key__][:inspect][id] = true end
seplist(list, sep=nil, iter_method=:each) { |element| ... } 按一下以切換來源
新增一個分隔的清單。預設情況下,清單會以逗號和可換行空白分隔。
seplist
使用 iter_method
迭代 list
。它會將每個物件傳遞給 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
# File lib/pp.rb, line 255 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