Это потому, что метод pp
по умолчанию является закрытым методом модуля Kernel
. Вот его источник :
def pp(*objs)
require 'pp'
pp(*objs)
end
Итак, как мы видим, он имеет побочный эффект загрузки pp
файла. И, похоже, этот файл переопределяет метод pp
, так как мы не получаем слишком большую ошибку стека из бесконечной рекурсии. Это действительно так. В pp
файле источника у нас есть что-то вроде этого:
module Kernel
# Returns a pretty printed object as a string.
#
# In order to use this method you must first require the PP module:
#
# require 'pp'
#
# See the PP module for more information.
def pretty_inspect
PP.pp(self, ''.dup)
end
# prints arguments in pretty form.
#
# pp returns argument(s).
def pp(*objs)
objs.each {|obj|
PP.pp(obj)
}
objs.size <= 1 ? objs.first : objs
end
module_function :pp
end
Итак, как мы видим, он переопределяет метод pp
как открытый метод экземпляра ядра. Вот почему явный вызов pp
до правильного вызова pp
вызывает ошибку. И поэтому после правильного вызова pp
ошибка исчезает.