我正在学习Ruby,在测试procs和lambdas的行为时,我写了这段代码:
def test_f(&a_block)
puts "in test_f"
yield 7
puts "still in test_f"
end
def test_f_2(&a_block)
puts "in test_f_2"
a_block.call(7)
puts "still in test_f_2"
end
lam = lambda do |i|
puts "lambda #{i}"
return "lambda #{i}"
end
test_f_2(&lam)
test_f(&lam)
运行它的结果是:
in test_f_2
lambda 7
still in test_f_2
in test_f
lambda 7
test.rb:17: in 'block in <main>': unexpected return <LocalJumpError>
from test.rb:3:in 'test_f'
from poop.rb:21:in '<main>'
我有两个问题:
yield
'将'lambda'转换为proc,因为只有在使用yield时才尝试返回会导致错误?我已经读过“当创建上下文不再存在时,调用包含返回的proc是不可能的”,但这里的上下文是全局的,所以我说{的创建上下文没有意义{1}}不再存在。但是,将lam
的整个创建括起来并在另一个函数中调用测试函数可以防止出现任何错误消息,这使我得出结论,正在运行的标准是对包含返回的proc的任何调用必须是从您可以返回的上下文中。
我是对的吗?