代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

foreach循环是否为块类型?

  •  1
  • Dan Rosenstark  · 技术社区  · 14 年前

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

    thingers.each { |thing|

    这个例子实际上很有趣(因为有另外一种内置的方法可以做到这一点)。在大多数现代语言中,都有一种方法可以迭代集合并对其应用一些内联代码。但后来我想也许 for (Thing thing : things) { 语法实际上是一种类型的块,甚至在像Java SAN Groovy这样的语言中是不存在的。

    所以问题是:for each循环是否是一种类型的块,尽管有固定的语法?

    编辑: 这个问题令人困惑,但我还是注意到了,所以我不能删除它。总之…我的意思是“闭包”,而不仅仅是代码块。至于我为什么将其标记为语言不可知论者,是因为我对如何在引擎盖下实现for-each不感兴趣。我更感兴趣的是,从程序员的角度来看,每个人都可以被认为是一个免费的封闭式语言,没有像Java那样的语言。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Ed Swangren    14 年前

    这绝对不是语言不可知论者(如标签所示)。

    例如,在Ruby中,您将向.each方法传递一个闭包或块。语义由语言定义。

    在C中,foreach编译为对ienumerable.getEnumerator的调用以及ienumerator.moveNext方法的使用。这取决于语言。

    编辑:

    编辑:这个问题令人困惑,但我还是注意到了,所以我不能删除它。总之…我的意思是“闭包”,而不仅仅是代码块。至于我为什么将其标记为语言不可知论者,是因为我对如何在引擎盖下实现for-each不感兴趣。我更感兴趣的是,从程序员的角度来看,每个人都可以被认为是一个免费的封闭式语言,没有像Java那样的语言。

    不,您只考虑一个用于关闭的用例。不能将控制结构传递给方法,因为在某些语言中可以使用闭包。控制结构不是第一类第一类数据类型,就像某些语言中的闭包一样。在“对集合中的每个对象运行此代码”的情况下,它们在语义上是相似的。但是,它只是一个示例,说明您可以对一个闭包做什么。

    你说你

        2
  •  1
  •   Jay    14 年前

    正如斯旺格伦所说,这个问题并不是语言不可知论的标签。除非有一些我不知道的关于“块”的一般“IT理论”定义。

    在Java中,“块”是包含在{}中的一系列语句。所以for语句通常在一个块上操作。块的目的是界定某些语言结构中包含的内容,如if语句和循环。

    我相信C和C++对“块”有类似的定义。

    大多数语言都有类似的概念。

    不确定这是否有帮助。

        3
  •  0
  •   deceze    14 年前
    foreach ($foo as $bar) {
        $baz = 'Hello, World!';
    }
    
    echo $baz; // 'Hello, World!', "leaked" from the "closure"
    

    不,对不起, foreach 在语言中,循环不是lambda、闭包或函数,而它们不是显式的。

        4
  •  0
  •   quantumSoup    14 年前

    请详细说明。我对“块”的定义是一段分组在一起的代码。在这种情况下,爪哇有很多东西可以是“块”。

    如果你谈论的是Ruby风格的块,这是真正的闭包,那么Java不支持它们(无论如何都不是任何明智的方式)。 foreach 是一个控制结构,其行为与闭包不同。

    关于您更新后的问题:使用闭包作为控制结构很容易,但是如果不是不可能的话,另一种方法就更难了。闭包是一个第一类函数,它允许您用它做一些非常酷的事情,而不仅仅是遍历元素。