【问题标题】:Ruby : return from calling methodRuby:从调用方法返回
【发布时间】:2015-11-04 10:19:51
【问题描述】:

我希望能够从调用方法返回,同时仍在被调用方法中。

例子:

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

有没有简单的方法来实现这一点?

我目前使用的“肮脏”方式是这样的:

def calling_method
  # stuff
  called_method and return
  # more stuff
end

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

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

【问题讨论】:

  • Ruby 和其他语言一样,在获取返回语句时结束方法。您可以使用内容设置变量并在此方法结束时返回。
  • 我真的不明白你的评论。你能提供一个代码示例吗?
  • 如果在语义上有意义,您也可以引发异常。
  • 不是那种情况,但是是的,我已经考虑过了。

标签: ruby return


【解决方案1】:

我认为,你不能那样做。

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

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

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

def calling_method
  # stuff
  called_method and return
  # more stuff
end

【讨论】:

  • 谢谢。你告诉我这是很常见的事实,这让我有点放心。我会等几分钟看看是否有更好的答案弹出然后投票,如果没有,请选择你的答案。
  • 与此同时,您可以看看这篇文章:blog.arkency.com/2014/07/… 和 stackoverflow.com/questions/5539106/… 和 .... 谷歌一下 :)
  • 第一个链接确认确实可以这样做,再次感谢:)
【解决方案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 关键字实际上是 procs 的 return。它结束 proc 的执行并返回给定的任何值(或默认为nil)。

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

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

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

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

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

【讨论】:

    【解决方案3】:

    这应该可行。从 lambda 返回应该继续其余的流程

    def calling_method
      # stuff
      lambda { called_method }
      # more stuff
    end
    

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多