一种选择可能是.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