刚刚意识到instance_eval
产生self
作为关联块的参数(除了 1.9.2 版本中的错误:http ://www.ruby-forum.com/topic/189422 )
1.9.3p194 :003 > class C;end
1.9.3p194 :004 > C.new.instance_eval {|*a| a}
=> [#<C:0x00000001f99dd0>]
1.9.3p194 :005 >
这是在某处记录/规范的吗?查看ruby-doc:BasicObject,看不到任何提到的块参数。
当它总是被定义时,是否有理由——除了一些纯粹的历史原因——明确地传递它?
我被这个击中的方式是:
l = lambda { }
myobj.instance_eval(&l) # barks
这在 1.8.x 中运行良好(我猜是因为没有强制执行块 arity)。
然后升级到 1.9.2 - 它仍然有效!这是一个奇怪的巧合,因为即使严格执行 lambda 块参数(所以它会抱怨没有为 self 声明参数),但是由于上面链接的错误 - self 实际上没有在这个版本中传递..
然后升级到修复了该错误的 1.9.3,因此它开始抛出参数错误 - 对于一个较小的版本更改恕我直言,这非常令人惊讶。
因此,一种解决方法是声明参数,或者将 lambda 设置为块:
l = proc { }
myobj.instance_eval(&l) # fine
只是想描述完整的故事,以帮助其他人避免像我一样浪费时间-直到正确记录为止。