Ruby:从调用方法返回

时间:2015-11-04 10:19:51

标签: ruby return

我希望能够在调用方法中返回调用方法。

示例:

def calling_method
  # stuff
  called_method
  # more stuff
end

def called_method
  # stuff
  return_from_caller if foo # << I would like to return from calling_method
  # more stuff
end

有没有一种简单的方法可以实现这一目标?

&#34;脏&#34;我现在使用的方式是:

def calling_method
  # stuff
  called_method and return
  # more stuff
end

def called_method
  # stuff
  return false if foo
  # more stuff
end

但这并不完全令人满意,因为我必须在调用方法中执行and return

2 个答案:

答案 0 :(得分:3)

我想,你不能这样做。

你能做到这一点的唯一方法(至少我现在能想到的)是,用你所谓的dirty方式来做。

实际上,do_something and return是一个非常常见的模式/用例,您可以在Ruby / Rails代码中看到。

所以,IMO,这是要走的路:

def calling_method
  # stuff
  called_method and return
  # more stuff
end

答案 1 :(得分:2)

这样的东西只能用于块,它能够直接返回产生块的方法。考虑这个例子:

# You don't need to specify &block here, it works the same if you omit it
# I added it for clarity
def calling_method(&block)
  puts 'before'
  puts yield
  puts 'after'
end

现在,您可以使用不同的块调用calling_method并观察方法的行为:

首先,我们使用一个返回简单值的常规块来调用它

calling_method { 3 }
# before
# 3
# after
# => nil

现在,我们尝试在块中使用next关键字时会发生什么:

calling_method { next 23 }
# before
# 23
# after
# => nil

next关键字实际上是针对触发的return。它结束了proc的执行并返回给定的任何值(或默认为nil)。

最后,我们来看看当我们在块中使用break时会发生什么:

p calling_method { break 23 }
# before
# => 23

当你在Ruby中使用break关键字时,会发生什么是proc返回AND,产生给块的方法也会立即返回给break关键字的值。

因此,如果您可以重写逻辑,以便可以在块中重写called_method中当前定义的行为并将其传递给calling_method,那么您可以控制返回行为块。

如果你必须调用实际的方法,那么called_method and return技术是唯一的方法。