你能在 Ruby 的代码块中让步吗?

Can you yield inside a code block in Ruby?

我目前正在学习 Ruby 并通过阅读畅销书“The well-grounded Rubyist”来学习。我确实非常了解代码块,或者我是这么认为的,直到我在第 191 页找到书中的这个代码示例:

open_user_file do |filename|
   fh = File.open(filename)
   yield fh
   fh.close
   rescue
     puts "Couldn't open your file"
end

现在我没有完全明白的是,在代码块中让步时我应该向谁让步?我的理解是,如果您调用一个可以产生的方法并且您提供了一个代码块,该方法将产生给您的代码块(甚至可能带有参数),您的代码块将执行,然后将控制权交还给该方法。但在此代码示例中,我们并没有在方法内产生,而是在代码块中产生。有人可以向我解释这是如何工作的以及这样的构造看起来如何吗?任何澄清表示赞赏!

(P.S。请不要告诉我“你不应该这样做”。我不是在问,因为我想在生产代码中这样做,我只是想了解Ruby深入。)

您那里的代码实际上不起作用,因为没有 yield 的块。

你会得到一个 LocalJumpError,它被 catch-all rescue 吞没了,因此它 看起来 就像有一个文件有问题,实际上是编程错误。 (受教时刻:never ever do a blanket catch-all rescue, always rescue only 正是您要处理的异常。)