我可以在里面获得返回值吗?确保'在Ruby?

时间:2014-10-13 23:02:47

标签: ruby

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

是否有一些(可能是元编程)原则/方法来获取方法的返回值"确保"子句是方法定义的一部分(我们都知道无论如何执行)?

2 个答案:

答案 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中需要这个?如果方法的主要部分没有完成,则该方法将返回该部分的返回值(除非您在returnensure)。如果发生异常,则根本不会计算主要部分中的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