【问题标题】:Can you yield inside a code block in Ruby?你能在 Ruby 中的代码块中屈服吗?
【发布时间】:2021-02-14 09:57:25
【问题描述】:

我目前正在学习 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

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

(PS 请不要告诉我“你不应该这样做”。我不是在问,因为我想在生产代码中这样做,我只是想深入了解 Ruby 的内部工作原理。)

【问题讨论】:

    标签: ruby iterator rubygems ruby-on-rails-5 iteration


    【解决方案1】:

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

    你会得到一个LocalJumpError,它会被包罗万象的rescue吞没,因此它会看起来好像文件有问题,但实际上有实际上是编程错误。 (可教的时刻:永远不会全面了解rescue总是拯救您想要处理的那些异常。)

    【讨论】:

    • 谢谢! :) 是的,这可以解释,我认为这本书可能有错误,但我真的想确保不是我忽略了什么。
    • 如果这段代码在一个方法中,那当然是完全不同的事情了。显然,你可以在一个方法中使用yield,不管yield是否嵌套在一个块中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2011-05-30
    • 2010-11-24
    • 2021-08-18
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多