模組 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