我希望能够在调用方法中返回调用方法。
示例:
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
。
答案 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
技术是唯一的方法。