如果没有明确定义,变量“p”在ruby中从哪里得到它的值?
问题: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 – 所以为什么它没有价值?既不识别也不认识foo,那么p的特殊之处是什么?我也没有找到Kernel#p下列出的任何内容 上下文:我正在阅读所谓的“28 bytes of ruby joy”并假设p是一个变量,如:def p.method_missing * _ … (别担心:我不打算在nil上实际定义method_missing …只研究一些ruby代码……) 解决方法
p只是
Kernel 上的一个方法,它调用了对其参数的检查,生成了这些对象的人类可读表示.如果你没有给它任何参数,它什么都不打印.不管你传递的是什么,它都会返回nil.见
Kernel#p 和
Object#inspect .
功能提示:在Ruby 1.9中,当你有一个方法并且你不知道它来自哪里时,使用方法方法: 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提供了一些来自this article的上下文,其中作者声称如果将method_missing添加到nil,您的生活会更容易,方法如下: def p.method_missing*_;p;end 这个有点混淆的代码应该被理解为: >定义一个名为method_missing的新方法(def).这会覆盖Object上的默认method_missing处理程序,它只会在遇到一个它不理解的方法时引发NoMethodError. 第二个子弹是这里棘手的部分. def p.method_missing是指两件事之一,具体取决于具体情况: >先前定义的名为p的对象,在此范围内. 使用def p.method_missing,我们的意思是“这个方法是在对象上定义的,这是调用没有参数的p的结果”.在这种情况下,那就是NilClass;如果你没有参数调用p,你就得零.因此,这只是在NilClass上定义方法的一种简短的hacky方式. 注意:我绝对建议不要在nil上定义method_missing.这是一个愚蠢而危险的策略,用于保存几行代码,因为它改变了nil的行为.不要这样做! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |