4

質問:下からその価値をどこpで得るのですか、そしてなぜそれが起こるのですか?

このirbセッションを検討してください。

me@somewhere:~$ irb
irb(main):001:0> a
NameError: undefined local variable or method `a' for main:Object
    from (irb):1
irb(main):002:0> foo
NameError: undefined local variable or method `foo' for main:Object
    from (irb):2
irb(main):003:0> p
=> nil
irb(main):004:0> p.class
=> NilClass
irb(main):005:0>

私は決して定義しませんでしpた-それで、なぜそれは価値がないのですか?どちらafoo認識されなかったので、何が特別なのpですか?下にリストされているものも見つかりませんでしたKernel#p

コンテキスト:いわゆる「28バイトのルビーの喜び」pを読んでいて、次のように変数であると想定しました: def p.method_missing *_..。

(心配しないでください:私は実際にどこでもnilでmethod_missingを定義するつもりはありません...ただいくつかのルビーコードを勉強しています...)

4

3 に答える 3

7

pは、引数Kernelを呼び出して、それらのオブジェクトの人間が読める表現を生成する単なるメソッドです。inspect引数を指定しないと、何も出力されません。ただし、何を渡しても、が返されますnilKernel#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!

于 2010-06-26T00:55:40.920 に答える
2

pinspect引数の値を出力してnilを返すメソッドです。引数がなければ、それは単に何もしません。

そのドキュメントは、Kernel#pではなく、下にありKernel::pます(カーネルのインスタンスメソッドであるため)。

于 2010-06-26T00:44:29.637 に答える
2

pKernelモジュールのメソッドです。デバッグに適しています。呼び出して、与えたものの内部表現を出力しますinspect。引数を渡さない場合は、単に出力されnilます。

irb(main):001:0> p 11
11
=> 11
irb(main):002:0> Kernel::p [1,2] + [3,4]
[1, 2, 3, 4]
=> [1, 2, 3, 4]

結果はここで2回印刷されます。これは、オブジェクトも返すため、irbも出力します。

于 2010-06-26T00:48:26.503 に答える