p
просто метод на Kernel
который называет inspect
по своим аргументам, производя удобочитаемых представления этих объектов. Если вы не дадите ему никаких аргументов, он ничего не печатает. Несмотря на то, что вы его передаете, он возвращает nil
. См. Kernel#p
и Object#inspect
.
Контроллер питания: В рубине 1.9, когда у вас есть метод и вы не знаете, откуда это, используйте метод method
:
ruby-1.9.1-p378 > method(:p)
=> #<Method: Object(Kernel)#p>
Собираем вместе один шаг за один раз, мы читаем это как:
p # We found a method called p.
#p # It's an instance method.
Object ... #p # It's available on Object.
Object(Kernel)#p # It came from the Kernel module.
Update: ОП при условии, некоторый контекст из this article, где автор утверждает, что ваша жизнь будет легче, если вы добавите method_missing
к nil
, выполнив следующие действия:
def p.method_missing*_;p;end
Это несколько запутанный код следует читать как:
- Определить новый метод (
def
), называется method_missing
. Это переопределяет обработчик по умолчанию method_missing
на Object
, который просто вызывает NoMethodError
, когда он сталкивается с методом, который он не понимает.
- Этот метод будет жить под названием
p
.
- Он принимает любое количество аргументов (
*
) и сохраняет их в переменной с именем _
.
- Результатом этих аргументов является то, что называется
p
.
Вторая пуля - сложная часть здесь. def p.method_missing
означает одно из двух, в зависимости от контекста:
- ранее определенный объект, называемый
p
, который находится в области видимости здесь.
- Метод, называемый
p
который находится в области видимости, и который не передал никаких аргументов.
С def p.method_missing
, мы имеем в виду, «этот метод определяется на объекте, который является результатом вызова p
без аргументов». В этом случае это NilClass
; если вы вызываете p
без аргументов, вы получаете nil
. Так что это всего лишь короткий, хакерский способ определения метода на NilClass
.
Примечание: Я определенно рекомендую против определения method_missing
на nil
. Это глупая и опасная тактика, используемая для сохранения нескольких строк кода, поскольку она изменяет поведение nil
. Не делай этого!
Я согласен: я думаю, что 28-байтовый подход интересен с точки зрения дизайна, но опасно изменить такое глобальное предположение, учитывая __другие люди могут полагаться на исключения, вызванные обменом сообщениями nil__. (Это от «о нет!», Они обнаружили метапрограмму «школы проблем обслуживания ...») – daf