1

我总是使用提前返回来减少嵌套 if(使用其他语言编程),如下所示:

//instead of nested if like this 
if (condition1) {
   if (condition2) {
     if (condition3) {
       //... finally meet all conditions 
       //do the job 
     }
   }
}
//return early 
if (!condition1) {
   //clean up resource in step #1
   return
}
if (!condition2) {
   //clean up resource in step #2
   return
}
if (!condition3) {
   //clean up resource in step #2
   return
}
...
//finally meet all conditions 

但是我如何在 ruby​​ 中提前返回?我无法在 Ruby 的 if 块内返回。我得到了错误

“未捕获的异常:意外返回......'块(2级)':意外返回(LocalJumpError)”

- - 更新 - - -

抱歉,我忘了提到在这样的简单情况下它可以工作

def early(input)
  if (input <0)
    puts 'should >0'
    return
  end
  puts 'good'
end

我正在学习 Fiber,我使用来自https://www.igvita.com/2010/03/22/untangling-evented-code-with-ruby-fibers/的示例

def http_get(url)
  f = Fiber.current
  http = EventMachine::HttpRequest.new(url).get

  # resume fiber once http call is done
  http.callback { f.resume(1,http) }
  http.errback  { f.resume(2,http) }

  return Fiber.yield
end

EventMachine.run do
  Fiber.new{
    result = http_get('https://www.google.com/')
    if (result[0] ==2) 
      puts "error"
      return # using break has the error 'break from proc-closure (LocalJumpError)' too 
    end
    result = http_get('https://www.google.com/search?q=eventmachine')
    page = result[1]
    puts "Fetched page 2: #{page.response}"
  }.resume
end

我得到了错误。

---- 更新 2 ----

有了我得到的答案和评论,我发现了这个如何从一个块中提前返回一些东西?

为什么在使用 Proc.new v. & 符号时,ruby 中的 break 语句表现不同?解释了为什么 break 也不起作用。引用“break 应该使块的调用者返回,但 Proc.new 已经返回。”

return vs break vs next 绝对是 ruby​​ 新手的障碍

4

1 回答 1

0

使用next而不是return提前退出内部块:

class A 
  def run 
    yield
  end
end

a = A.new
a.run do 
  puts "ola"
  next
  puts "hello"
end

为了使用return,它应该直接放在方法体内。

但是,当您将块传递给函数时, withEventMachine.run do和 with Fiber.new{,块内的代码并不直接在函数内部,而是作为参数传递给不同的函数。在块内你不能调用return,但你可以提前退出next

我猜设计师之所以决定这样做是因为return块内部会导致块是否返回或整个方法的混淆。

于 2018-12-21T09:45:03.727 回答