从语言设计的角度来看,为什么红宝石块不是一流的?
主要是出于性能原因,据我所知.考虑:
def test_yield
yield
end
def test_block &block
block.call
end
la = lambda {}
def test_lambda l
l.call
end
Run Code Online (Sandbox Code Playgroud)
然后,使用前两个空块进行基准测试,使用la相同的新调用或使用相同的新数据块la,并注意每种情况下产量的速度.原因是,explicit&block变量创建一个Proc对象,就像lambda一样,而仅仅屈服则不会.
副作用(我实际上已经发现,通过使用proc对象来递归管道传递的块),你不能在某种封闭范围之外的proc或lambda中产生:
foo = proc { yield if block_given? }
foo.call { puts 'not shown' }
def bar
baz = proc { yield if block_given? }
baz.call
end
bar { puts 'should show' }
Run Code Online (Sandbox Code Playgroud)
这是因为,当我逐渐理解它时(由于这个原因,我失去了很多头发,直到它被勾勒出来),block_given?当foo调用它时被发送到main,并且当它在bar中被评估时禁止那个baz.