block、proc 和 lambda 不是一回事
第一次遇到 LocalJumpError: unexpected return 的时候,代码看起来毫无问题:一个方法里创建了 Proc,存进实例变量,稍后再调用。可只要这个 Proc 里写了 return,调用时就会炸。把 proc 改成 lambda,一切又恢复正常。
这不是玄学,而是 Ruby 里 block、proc、lambda 三者在「参数检查」和「控制流」上的语义差异。搞清楚这几点,很多看似奇怪的行为都能解释。
先理清关系:block 不是对象
Ruby 里只有 block 是语法结构,不是对象。它只能跟在方法调用后面,通过 yield 执行: