p
は、引数Kernel
を呼び出して、それらのオブジェクトの人間が読める表現を生成する単なるメソッドです。inspect
引数を指定しないと、何も出力されません。ただし、何を渡しても、が返されますnil
。Kernel#p
およびを参照してくださいObject#inspect
。
パワーヒント: Ruby 1.9では、メソッドがあり、それがどこから来たのかわからない場合は、次のmethod
メソッドを使用します。
ruby-1.9.1-p378 > method(:p)
=> #<Method: Object(Kernel)#p>
一度に1ステップずつまとめると、次のようになります。
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.
更新: OPは、この記事method_missing
からいくつかのコンテキストを提供しました。著者は、にを追加するとnil
、次のようにすることで、あなたの生活が楽になると主張しています。
def p.method_missing*_;p;end
このやや難読化されたコードは、次のように読み取る必要があります。
def
と呼ばれる新しいメソッド()を定義しmethod_missing
ます。これは、のデフォルトmethod_missing
ハンドラーをオーバーライドします。これは、理解できないメソッドに遭遇しObject
たときにを発生させるだけです。NoMethodError
- このメソッドは、と呼ばれるもので実行され
p
ます。
- 任意の数の引数(
*
)を受け入れ、それらを。という変数に格納します_
。
- これらの引数の結果は、と呼ばれるもの
p
です。
2番目の箇条書きはここで注意が必要な部分です。def p.method_missing
コンテキストに応じて、次の2つのいずれかを意味します。
p
ここでスコープ内にある、と呼ばれる以前に定義されたオブジェクト。
p
スコープ内にあり、引数が渡されない、呼び出されたメソッド。
With def p.method_missing
, we mean, "this method is being defined on the object which is the result of calling p
with no arguments". In this case, that is NilClass
; if you call p
with no arguments, you get nil
. So this is just a short, hacky way to define a method on NilClass
.
Note: I definitely recommend against defining a method_missing
on nil
. This is a silly and dangerous tactic to use for the sake of saving a few lines of code, because it changes the behavior of nil
. Don't do it!