gpt4 book ai didi

ruby block 不是一流的

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:14 26 4
gpt4 key购买 nike

从语言设计的角度来看,为什么 ruby​​ block 不是一流的?

同样,我认为 block 实际上应该是 lambda,从而摆脱对繁琐语法的需要,例如 proc {...}.call 或 &proc 或 lambda 或 Proc.new。这也将消除对产量的需求。

最佳答案

From a language design perspective, why aren't ruby blocks first-class?

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

def test_yield
yield
end

def test_block &block
block.call
end

la = lambda {}

def test_lambda l
l.call
end

然后,对前两个使用空 block 进行基准测试,与每次调用使用新的 la 或使用相同的 la 的第三个进行基准测试,并注意速度有多快yield 在每种情况下都会发生。原因是,显式 &block 变量创建一个 Proc 对象,就像 lambda 一样,而仅仅 yield 则不会。

一个副作用(我实际上发现它用于通过使用 proc 对象递归地管道传递 block )是你不能在某种封闭范围之外的 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' }

这是因为,据我了解(我因此掉了很多头发,直到它滴答作响),block_given?当 foo 调用它时被发送到 main,而当它在 bar 中被评估时被发送到 bar 而不是 baz。

关于 ruby block 不是一流的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6685803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com