加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:58:00 所属栏目:百科 来源:网络整理
导读:问题:p从哪里获得它的价值,为什么会发生? 考虑这个irb会话: me@somewhere:~$irbirb(main):001:0 aNameError: undefined local variable or method `a' for main:Object from (irb):1irb(main):002:0 fooNameError: undefined local variable or method `f
问题: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#pObject#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.
>这种方法将生活在一种叫做p的东西上.
>它接受任意数量的参数(*)并将它们存储在一个名为_的变量中.
>这些论证的结果叫做p.

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

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

使用def p.method_missing,我们的意思是“这个方法是在对象上定义的,这是调用没有参数的p的结果”.在这种情况下,那就是NilClass;如果你没有参数调用p,你就得零.因此,这只是在NilClass上定义方法的一种简短的hacky方式.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读