1

我正在开发一个 Ruby 应用程序,并且正在使用 puts 和其他方法在方法中显示变量以跟踪正在发生的事情。好吧,那当然是改变了方法的“回报”。是否有一个通用的 Ruby 变量允许我在终止该方法之前访问该方法中的当前返回变量?这样,我可以在 puts 中访问它,然后确保在终止之前再次设置它。我确实明白该方法的最后一个结果是向前传递的。我正在寻找一种通用的方式来访问该变量,无论它可能是我正在调试的任何方法。

我使用 Rubymine 作为我的 IDE,我确实使用它进行调试。但是,像 IRB 这样的 REPL 有一些有趣的地方。这可能是我心中的 360 汇编程序员,但我正在和自己约会。你们中有多少人在 1969 年首次编程?哈哈。

谢谢。

4

3 回答 3

5

一种选择可能是.tap方法。假设你有

x = foo

并想知道foo外部的返回值是什么:

x = foo.tap { |r| puts r.inspect }

puts r.inspect其余的arewritten p r,这是同一事物的有效速记语法(顺便说一下,p返回它的参数,所以在许多情况下,你可以p在返回的变量前面加上 a - 除了一些语法细节)

或者,如果你想检查内部foo,定义是这样的:

def foo
  # Do stuff
  something_that_is_returned
end

您可以在.tap不影响返回值的情况下添加到最后一条语句:

def foo
  # Do stuff
  something_that_is_returned.tap { |r| p r }
end

这是有效的,因为.tap将当前对象生成给块,并返回原始对象,而不管块的返回值如何。.tap将 a插入一长串方法以检查中间结果非常有用。

例如你有

x = foo.map {|x| whatever}.select {|x| whatever}

并且想知道在select不重写大量代码的情况下收到了什么:

x = foo.map {|x| whatever}.tap { |r| p r }.select {|x| whatever}

如果您发现自己经常这样做,您可能希望为它定义一个全局方法:

def tapp
  tap do |o|
    p o
  end
end

要使用,只需附加.tapp到表达式:

something_that_is_returned.tapp
于 2013-06-11T19:45:58.960 回答
3

或者,如果你想更有表现力,你可以定义一个方法

def puts_and_return(r)
    puts r
    r
end

然后使用

puts_and_return (last statement of method)
于 2013-06-11T19:56:08.033 回答
0

为什么简单的 put 对您不起作用?

def foo
  bar = 1
  puts bar
  bar
end
于 2013-06-11T19:39:03.930 回答