Foreach循环是一种块吗?

时间:2010-08-16 03:00:05

标签: closures

在思考积木时,我总是想知道为什么

thingers.each { |thing|

示例实际上很有趣(因为还有另一种内置方式)。在大多数现代语言中,有一种方法可以遍历集合并将一些内联代码应用于它。但后来我认为for (Thing thing : things) {语法可能实际上是一种块,即使在像Java-sans-Groovy这样的语言中也没有。

所以问题是:for-each循环是一种块,虽然语法固定吗?

编辑:这个问题令人困惑,但引起了一些关注,所以我无法将其删除。无论如何......通过Blocks我的意思是“闭包”而不仅仅是代码块。至于为什么我将其标记为语言不可知,我对于如何在幕后实现for-each不感兴趣。我更感兴趣的是,从程序员的角度来看,for-each是否可以被认为是没有它们的语言的免费赠品闭包,比如Java。

4 个答案:

答案 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,闭包或函数,而不是明确的语言。