module PP::PPMethods
Modul, das Hilfsmethoden für pretty_print definiert.
Öffentliche Instanzmethoden
Source
# File lib/pp.rb, line 161 def check_inspect_key(id) recursive_state = Thread.current[:__recursive_key__] or return false recursive_state[:inspect]&.include?(id) end
Prüft, ob die Objekt-ID id im aktuellen Puffer von Objekten, die per Pretty Print ausgegeben werden sollen, enthalten ist. Wird verwendet, um Zyklen in Ketten von Objekten zu brechen, die per Pretty Print ausgegeben werden sollen.
Source
# File lib/pp.rb, line 238 def comma_breakable text ',' breakable end
Eine Komfortmethode, die dasselbe tut wie die folgende
text ',' breakable
Source
# File lib/pp.rb, line 147 def guard_inspect_key recursive_state = Thread.current[:__recursive_key__] ||= {}.compare_by_identity save = recursive_state[:inspect] ||= {}.compare_by_identity begin recursive_state[:inspect] = {}.compare_by_identity yield ensure recursive_state[:inspect] = save end end
Liefert an einen Block und bewahrt den vorherigen Satz von per Pretty Print ausgegebenen Objekten.
Source
# File lib/pp.rb, line 228 def object_address_group(obj, &block) str = Kernel.instance_method(:to_s).bind_call(obj) str.chomp!('>') group(1, str, '>', &block) end
Eine Komfortmethode, ähnlich wie object_group, die aber auch die Objekt-ID des Objekts neu formatiert.
Source
# File lib/pp.rb, line 222 def object_group(obj, &block) # :yield: group(1, '#<' + obj.class.name, '>', &block) end
Eine Komfortmethode, die dasselbe tut wie die folgende
group(1, '#<' + obj.class.name, '>') { ... }
Source
# File lib/pp.rb, line 173 def pop_inspect_key(id) Thread.current[:__recursive_key__][:inspect].delete id end
Entfernt ein Objekt aus dem Satz von Objekten, die per Pretty Print ausgegeben werden.
Source
# File lib/pp.rb, line 200 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 guard_inspect(obj) do group do obj.pretty_print self rescue NoMethodError text Kernel.instance_method(:inspect).bind_call(obj) end end end
Fügt obj dem Pretty Printing Puffer hinzu, indem Object#pretty_print oder Object#pretty_print_cycle verwendet wird.
Object#pretty_print_cycle wird verwendet, wenn obj bereits ausgegeben wurde, d.h. die Objektverweiskette einen Zyklus aufweist.
Source
# File lib/pp.rb, line 302 def pp_hash(obj) group(1, '{', '}') { seplist(obj, nil, :each_pair) {|k, v| group { pp_hash_pair k, v } } } end
Ein Pretty Print für einen Hash
Source
# File lib/pp.rb, line 314 def pp_hash_pair(k, v) if Symbol === k if k.inspect.match?(%r[\A:["$@!]|[%&*+\-\/<=>@\]^`|~]\z]) k = k.to_s.inspect end text "#{k}:" else pp k text ' ' text '=>' end group(1) { breakable pp v } end
Ein Pretty Print für ein Paar von Hash
Source
# File lib/pp.rb, line 286 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
Eine aktuelle, sichere Standardlösung für das Pretty Printing jedes gegebenen Object
Source
# File lib/pp.rb, line 168 def push_inspect_key(id) Thread.current[:__recursive_key__][:inspect][id] = true end
Fügt die Objekt-ID id dem Satz von Objekten hinzu, die per Pretty Print ausgegeben werden, um Wiederholungen von Objekten zu vermeiden.
Source
# File lib/pp.rb, line 267 def seplist(list, sep=nil, iter_method=:each) # :yield: element sep ||= lambda { comma_breakable } first = true kwsplat = EMPTY_KWHASH list.__send__(iter_method) {|*v| if first first = false else sep.call end kwsplat ? yield(*v, **kwsplat) : yield(*v) } end
Fügt eine getrennte Liste hinzu. Die Liste wird standardmäßig durch ein Komma mit einem umbrechbaren Leerzeichen getrennt.
seplist iteriert über die list mit iter_method. Sie liefert jedes Objekt an den für seplist gegebenen Block. Das Verfahren separator_proc wird zwischen jeder Übergabe aufgerufen.
Wenn die Iteration nullmal erfolgt, wird separator_proc überhaupt nicht aufgerufen.
Wenn separator_proc nil ist oder nicht gegeben wird, wird +lambda { comma_breakable }+ verwendet. Wenn iter_method nicht gegeben wird, wird :each verwendet.
Zum Beispiel haben die folgenden 3 Codefragmente eine ähnliche Wirkung.
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