红宝石块不是一流的

Fra*_*art 7 ruby lambda language-design block

从语言设计的角度来看,为什么红宝石块不是一流的?

类似地,我认为块实际上应该是lambdas,从而摆脱了繁琐的语法需求,例如proc {...}.call或&proc或lambda或Proc.new.这也将摆脱对收益的需求.

Den*_*rdy 6

从语言设计的角度来看,为什么红宝石块不是一流的?

主要是出于性能原因,据我所知.考虑:

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.