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——那为什么它的价值为零?既没有a也没有foo被认出来,有什么特别之处p呢?我也没有找到下面列出的任何内容Kernel#p

上下文:我正在阅读所谓的“28 bytes of ruby​​ joy”并假设p是一个变量,如:def p.method_missing *_...

(别担心:我不会在任何地方都将 method_missing 定义为 nil ......只是研究一些 ruby​​ 代码......)

4

3 回答 3

7

p只是一种Kernel调用inspect其参数的方法,生成这些对象的人类可读表示。如果你不给它任何参数,它什么也不打印。但是,无论您传递什么,它都会返回nil. 见Kernel#pObject#inspect

强力提示:在 Ruby 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.

更新: OP 从本文中提供了一些上下文,作者声称如果您添加method_missingto nil,您的生活会更轻松,方法是执行以下操作:

def p.method_missing*_;p;end

这个有点混淆的代码应该读作:

  • 定义一个新方法 ( def),称为method_missing。这会覆盖 on 的默认method_missing处理程序,它会在遇到它不理解的方法时Object简单地引发 a 。NoMethodError
  • 此方法将存在于名为p.
  • 它接受任意数量的参数 ( *) 并将它们存储在一个名为 的变量中_
  • 这些论点的结果称为p.

第二个项目符号是这里的棘手部分。def p.method_missing根据上下文,表示两件事之一:

  • 一个先前定义的对象被称为p在此范围内。
  • 一个被调用的方法p,它在范围内,并且不传递任何参数。

使用def p.method_missing,我们的意思是,“这个方法是在对象上定义的,它是p不带参数调用的结果”。在这种情况下,即NilClass; 如果你p不带参数调用,你会得到nil. 所以这只是在NilClass.

注意:我绝对建议不要定义 a method_missingon nil。这是为了节省几行代码而使用的一种愚蠢而危险的策略,因为它会改变nil. 不要这样做!

于 2010-06-26T00:55:40.920 回答
2

p是一种打印inspect其参数值并返回 nil 的方法。没有参数,它根本什么都不做。

它的文档在Kernel#p, not下Kernel::p(因为它是 Kernel 的实例方法)。

于 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]

结果在这里打印了两次,因为它还返回了对象,然后 irb 也会打印出来。

于 2010-06-26T00:48:26.503 回答