我正在调试一个如下所示的方法
def method
if something
"a"
elsif somethingelse
"b"
#elseif ...
else
"z"
end
# the current return value is ???
end
Ruby 的工作方式给人的印象是每个表达式都会返回一个值并且它被保存在某个地方。最后一个将在方法结束时返回(如果没有找到return
)。
在上面的例子中,if 条件返回一个字符串(它存储在某处?),并且在方法的末尾,由于没有其他任何更改,因此返回该字符串。
是否可以访问该值? (有点像控制台中的_
,返回最后一个命令的结果)
最佳答案
[基于Aleksei Matiushkin's comment]
在 Ruby 中,控制表达式有一个返回值。
您的方法仅返回 if
expression 的结果。您可以通过 tap
检查它:
def foo(b)
if b
123
else
456
end.tap { |result| p result: result }
end
foo(true)
# prints {:result=>123}
#=> 123
foo(false)
# prints {:result=>456}
#=> 456
如果您遇到更复杂的情况,没有最后一个表达式,例如:
class C
def foo(b)
return 123 if b
456
end
end
您可以使用改进来替换该方法:
module M
refine C do
def foo(*)
super.tap { |result| p result: result }
end
end
end
用法:
using M
c = C.new
c.foo(true)
# prints {:result=>123}
#=> 123
c.foo(false)
# prints {:result=>456}
#=> 456
另一种方法是使用 TracePoint
来 Hook 执行:
def foo(b) # 1
return 123 if b # 2
456 # 3
end # 4
TracePoint.trace(:return) do |tp|
puts "method `#{tp.method_id}' returned #{tp.return_value.inspect} on line ##{tp.lineno}"
end
foo(true)
foo(false)
输出:
method `foo' returned 123 on line #2
method `foo' returned 456 on line #4
请注意,这会打印所有方法调用的返回值。您可能希望将其限制为 tp.method_id == :foo
关于ruby - 如果函数返回的值未存储在变量中,是否可以获取该值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58937856/