问题:从哪里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字节的红宝石快乐"并假设p是一个变量,如:def p.method_missing *_......
(别担心:我不打算在nil上实际定义method_missing ...只研究一些ruby代码......)
p只是一个Kernel调用inspect其参数的方法,生成这些对象的人类可读表示.如果你没有给它任何参数,它什么都不打印.不管你传递了什么,它都会回归nil.见Kernel#p和Object#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_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.所以这只是定义方法的一种简短的hacky方式NilClass.
注意:我绝对建议不要定义method_missingon nil.这是一个愚蠢而危险的策略,用于保存几行代码,因为它改变了行为nil.不要这样做!