如果没有明确定义,变量"p"在ruby中从哪里得到它的值?

Daf*_*ees 4 ruby jruby irb

问题:从哪里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>
Run Code Online (Sandbox Code Playgroud)

我从未定义过p- 为什么它没有价值?既a没有foo被认出也没有被认出那么特别的是p什么?我也没有找到任何列出的内容Kernel#p

上下文:我正在阅读所谓的"28字节的红宝石快乐"并假设p是一个变量,如:def p.method_missing *_......

(别担心:我不打算在nil上实际定义method_missing ...只研究一些ruby代码......)

Joh*_*lla 7

p只是一个Kernel调用inspect其参数的方法,生成这些对象的人类可读表示.如果你没有给它任何参数,它什么都不打印.不管你传递了什么,它都会回归nil.见Kernel#pObject#inspect.

功能提示:在Ruby 1.9中,当你有一个方法并且你不知道它来自何处时,请使用以下method方法:

ruby-1.9.1-p378 > method(:p)
 => #<Method: Object(Kernel)#p>
Run Code Online (Sandbox Code Playgroud)

将它一次一步地组合在一起,我们将其读作:

 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.
Run Code Online (Sandbox Code Playgroud)

更新:在OP提供一些背景这篇文章,在这里笔者声称,如果添加了你的生活会更容易method_missingnil,通过执行以下操作:

def p.method_missing*_;p;end
Run Code Online (Sandbox Code Playgroud)

这个有点混淆的代码应该被理解为:

  • 定义一个def名为的新方法()method_missing.这会覆盖默认method_missing处理程序Object,它只会NoMethodError在遇到它不理解的方法时引发它.
  • 这种方法将存在于所谓的东西上p.
  • 它接受任意数量的arguments(*)并将它们存储在一个名为的变量中_.
  • 这些参数的结果是所谓的p.

第二个子弹是这里棘手的部分.def p.method_missing意味着两件事之一,取决于具体情况:

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

有了def p.method_missing,我们的意思是,"这种方法被值为调用的结果的对象上定义p不带参数".在这种情况下,那是NilClass; 如果你打电话p没有参数,你得到nil.所以这只是定义方法的一种简短的hacky方式NilClass.

注意:我绝对建议不要定义method_missingon nil.这是一个愚蠢而危险的策略,用于保存几行代码,因为它改变了行为nil.不要这样做!