pp在Ruby中提高了NoMethodError
我正在使用Ruby 2.6.3 Ruby ri将pp文档记录为: 以漂亮的形式打印参数 无论如何,在文件中,当我编写并运行以下代码时:pp在Ruby中提高了NoMethodError,ruby,Ruby,我正在使用Ruby 2.6.3 Ruby ri将pp文档记录为: 以漂亮的形式打印参数 无论如何,在文件中,当我编写并运行以下代码时: #!/usr/bin/ruby -w Kernel.pp 'hi' pp 'hi' 我得到了一个名字 但是下面的代码是如何工作的呢 #!/usr/bin/ruby -w pp 'hi' Kernel.pp 'hi' 输出: "hi" "hi" 这里有一个是因为pp方法默认是内核模块的私有方法。以下是它的: 正如我们所看到的,它的副作用是加载pp文件。这
#!/usr/bin/ruby -w
Kernel.pp 'hi'
pp 'hi'
我得到了一个名字
但是下面的代码是如何工作的呢
#!/usr/bin/ruby -w
pp 'hi'
Kernel.pp 'hi'
输出:
"hi"
"hi"
这里有一个是因为
pp
方法默认是内核
模块的私有方法。以下是它的:
正如我们所看到的,它的副作用是加载pp
文件。这个文件似乎重新定义了pp
方法,因为我们不会从无限递归中得到太深的堆栈错误。事实确实如此。在这方面,我们有这样的东西:
module Kernel
# Returns a pretty printed object as a string.
#
# In order to use this method you must first require the PP module:
#
# require 'pp'
#
# See the PP module for more information.
def pretty_inspect
PP.pp(self, ''.dup)
end
# prints arguments in pretty form.
#
# pp returns argument(s).
def pp(*objs)
objs.each {|obj|
PP.pp(obj)
}
objs.size <= 1 ? objs.first : objs
end
module_function :pp
end
模块内核
#以字符串形式返回打印精美的对象。
#
#要使用此方法,必须首先要求PP模块:
#
#需要“pp”
#
#有关更多信息,请参阅PP模块。
def pretty_inspect
PP.PP(自我,.dup)
结束
#以漂亮的形式打印参数。
#
#pp返回参数。
def pp(*objs)
objs.each{| obj|
PP.PP(obj)
}
objs.size实际的pp
方法在Ruby附带的模块中实现,该模块也称为pp
。对于较旧的红宝石,为了使用该方法,您必须始终运行
require'pp'
pp“foo”
较新的Rubies附带了一种方便的方法,自动需要pp
模块并运行该方法。第一次调用此方法后(因此使用模块的require
),前一个方法将替换为实际使用的pp
方法
因此,如果您首先运行instance方法pp
(在Ruby中的所有对象(包括内核
模块,即关于所有对象)上作为私有方法可用,pp
模块被加载,其他方法也被加载(包括Kernel.pp
类方法可用。我知道env ruby是可靠的,我应该使用它。但我使用的是Arch Linux,它有最新稳定的ruby版本。顺便说一句,这里有一个屏幕截图:@s.Goswami您的问题缺少一点信息,您所面临的实际问题是由显式私有方法调用atte引起的不管怎样,我编辑了我的答案,我想它现在回答了你的问题。它看起来有点奇怪…当你调用Kernel.pp
时,它会引发NoMethodError,因为它是一个私有方法。当你直接从主对象调用pp
时,它会将一些东西打印到STDOUT,但是当你调用Kernel.pp
时,它工作得很好,它看起来很好ike模块内核的私有方法pp
就像一个公共方法一样!@S.Goswami仔细阅读了我和Holger的答案。一切都在那里。长话短说,第一个pp
调用实际上重新定义了pp
方法,从现在起它是公共的,而不是私有的。你很幸运地收到了两个极好的答案。是的!我只是够幸运的;)
module Kernel
# Returns a pretty printed object as a string.
#
# In order to use this method you must first require the PP module:
#
# require 'pp'
#
# See the PP module for more information.
def pretty_inspect
PP.pp(self, ''.dup)
end
# prints arguments in pretty form.
#
# pp returns argument(s).
def pp(*objs)
objs.each {|obj|
PP.pp(obj)
}
objs.size <= 1 ? objs.first : objs
end
module_function :pp
end