a NameError: undefined-6ren">
gpt4 book ai didi

ruby - 如果变量 "p"没有明确定义,它在 ruby​​ 中从哪里获取它的值?

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:26 25 4
gpt4 key购买 nike

问题:p 从哪里获取它的值,为什么会这样?

考虑这个 irb session :

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 - 为什么它的值为 nil? afoo 都没有被识别,那么 p 有什么特别之处呢?我也没有在 Kernel#p

下找到任何内容

上下文:我在读所谓的"28 bytes of ruby joy"并假设 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 提供了来自 this article 的一些上下文,作者声称如果您将 method_missing 添加到 nil,您的生活会更轻松,方法是执行以下操作:

def p.method_missing*_;p;end

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

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

第二个项目符号是这里的棘手部分。 def p.method_missing 表示以下两种情况之一,具体取决于上下文:

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

对于 def p.method_missing,我们的意思是,“此方法是在对象上定义的,该对象是不带参数调用 p 的结果”。在本例中,即 NilClass;如果你不带参数调用 p,你将得到 nil。所以这只是在 NilClass 上定义方法的一种简短的、hacky 的方式。

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

关于ruby - 如果变量 "p"没有明确定义,它在 ruby​​ 中从哪里获取它的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3122252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com