在思考积木时,我总是想知道为什么
thingers.each { |thing|
示例实际上很有趣(因为还有另一种内置方式)。在大多数现代语言中,有一种方法可以遍历集合并将一些内联代码应用于它。但后来我认为for (Thing thing : things) {
语法可能实际上是一种块,即使在像Java-sans-Groovy这样的语言中也没有。
所以问题是:for-each循环是一种块,虽然语法固定吗?
编辑:这个问题令人困惑,但引起了一些关注,所以我无法将其删除。无论如何......通过Blocks我的意思是“闭包”而不仅仅是代码块。至于为什么我将其标记为语言不可知,我对于如何在幕后实现for-each不感兴趣。我更感兴趣的是,从程序员的角度来看,for-each是否可以被认为是没有它们的语言的免费赠品闭包,比如Java。
答案 0 :(得分:3)
这绝对不是语言不可知的(因为它被标记)。
例如,在Ruby中,您将一个闭包或块传递给.each方法。语义由语言定义。
在C#中,foreach编译调用IEnumerable.GetEnumerator并使用IEnumerator.MoveNext方法。这取决于语言。
编辑:
编辑:这个问题令人困惑,但引起了一些注意,所以我无法将其删除。无论如何......通过Blocks我的意思是“闭包”而不仅仅是代码块。至于为什么我将其标记为语言不可知,我对于如何在幕后实现for-each不感兴趣。我更感兴趣的是,从程序员的角度来看,for-each是否可以被认为是没有它们的语言的免费赠品闭包,比如Java。
不,你只想到一个闭包的用例。您无法将控制结构传递给方法,因为您可以使用某些语言的闭包。控件结构不是第一类第一类数据类型,就像某些语言中的闭包一样。在“在集合中的每个对象上运行此代码”的情况下,是的,它们在语义上是相似的。但是,这只是关于闭包可以做什么的一个例子。
你说你是
答案 1 :(得分:1)
正如Swangren所说,这个问题并不像语言那样被语言无关。除非有一些我不了解的“块”的一般“IT理论”定义。
在Java中,“块”是{}中包含的一系列语句。因此FOR语句通常在块上运行。块的目的是界定某些语言结构中包含的内容,如IF语句和循环。
我相信C和C ++对“块”有类似的定义。
大多数语言都有类似的概念。
不确定这是否有帮助。
答案 2 :(得分:0)
请详细说明。我对“块”的定义是一组代码组合在一起。在这种情况下,Java中有很多东西可以是“块”
如果你在讨论ruby风格的块,它们真的是封闭的,那么Java就不支持它们(不管怎么说都不是这样)。 foreach
是一种控制结构,其行为与闭包不同。
关于你的更新问题:使用闭包很容易作为控制结构,但另一种方法是更难,如果不是不可能的话。闭包是一个第一类函数,它允许你用它做一些非常酷的东西 - 而不仅仅是遍历元素。
答案 3 :(得分:0)
foreach ($foo as $bar) {
$baz = 'Hello, World!';
}
echo $baz; // 'Hello, World!', "leaked" from the "closure"
不,抱歉,foreach
循环不是lambdas,闭包或函数,而不是明确的语言。