def some_method
puts 'in method'
return 'I am a return value'
ensure
puts 'will print at the end'
# Can I somehow get the return value of some_method here?
end
是否有一些(可能是元编程)原则/方法来获取方法的返回值"确保"子句是方法定义的一部分(我们都知道无论如何执行)?
答案 0 :(得分:4)
只需将返回值设为变量即可。您可以在ensure语句中使用该变量,但该方法的返回值将是在该方法的非例外部分中计算的最后一个语句。例如:
def some_method
puts 'in method'
value = 'I am a return value'
ensure
puts 'will print at the end'
puts value
true
end
some_method
#=> "I am a return value"
请注意,即使您提前返回,上述技术仍然有效,因为传递给 return 关键字的值仍然是评估的最后一个非异常表达式。例如,以下方法永远不应返回false:
def return_true
return value = true
false
ensure
puts value
false
end
return_true
#=> true
答案 1 :(得分:1)
为什么在ensure
中需要这个?如果方法的主要部分没有完成,则该方法将返回该部分的返回值(除非您在return
中ensure
)。如果发生异常,则根本不会计算主要部分中的return
。
当然,您总是可以使用以下(非常丑陋的IMO)代码。但请不要这样做。更好的想法是只在资源清理代码中保留确保块。
def some_method
finished = false
begin
puts 'in method'
result = 'I am a return value'
finished = true
ensure
puts 'will print at the end'
# Do whatever is needed for cleanup
if finished
# Here result is defined, you can manipulate it if needed
return result
end
end
end