Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pp在Ruby中提高了NoMethodError_Ruby - Fatal编程技术网

pp在Ruby中提高了NoMethodError

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文件。这

我正在使用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
文件。这个文件似乎重新定义了
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