你能在 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 正是您要处理的异常。)
我目前正在学习 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 正是您要处理的异常。)