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