【问题标题】:Does c/c++/java/PHP have closure?c/c++/java/PHP 有闭包吗?
【发布时间】:2011-05-28 12:01:22
【问题描述】:

到目前为止,我只在 javascript 中看到了闭包:

var name=...;

$(..).onclick(function() {
     //here I can reference to name
});

c/c++/java/PHP 中是否存在此功能?

如果存在,有可用的 hello world 示例吗?

【问题讨论】:

  • 你的例子不是closure
  • 您所说的称为 lambda 函数。关闭意味着别的东西。
  • @Gumbo,对我来说就像一个闭包。授予 onclick 位无关紧要,尽管匿名函数确实会在范围内关闭,包括 name 就像描述的 OP 一样。你们吵什么?
  • @davin:除非函数不引用不在其本地范围内的变量,否则它不是闭包。但现在我看到他的评论表示对外部name 的引用。 :)
  • @Gumbo,不确定你的意思。即使在这种情况下,它仍然是一个闭包,只是该函数不会利用其闭包特性,并且该示例不会很有帮助,尽管它仍然是正确的。抛开实现细节不谈,javascript 中的每个函数表达式都是一个闭包。

标签: java php c++ c closures


【解决方案1】:

对于 PHP,您可以像这样在闭包方法中启用对特定变量的访问:

$xVar = "var";

$closure = function() use ($xVar) {
    echo $xVar;
}

$closure();

也可以在闭包内改变这个变量:

$xVar = "var";

$closure = function($newVar) use (&$xVar) {
   $xVar = $newVar;
}

$closure("new var content");

【讨论】:

    【解决方案2】:

    C 不,因为函数不是一流的对象。
    C++ 还没有,但它与即将到来的标准(通常称为 C++0x)兼容,使用所谓的 lambda 表达式:

    std::string name;
    auto mylambda = [&](){ std::cout << name; };
    //               ^ automatically reference all objects in the enclosing scope.
    

    【讨论】:

    • 头等对象是什么意思?
    • @compile-fan:这意味着你不能on-the-fly创建它们,就像你可以创建intstruct 一样。函数必须在编译时都知道。
    【解决方案3】:

    C++11 有闭包,PHP 也有闭包。我不确定 Java。

    【讨论】:

      【解决方案4】:

      在某一时刻,闭包(Lambda 项目)将成为 Java 7 的一部分,但它们目前被列为 "Deferred to Java 8 or later"

      【讨论】:

        【解决方案5】:

        http://en.wikipedia.org/wiki/Closure_%28computer_science%29#PHP

        对于 PHP

        <?php
        $greet = function($name)
        {
            printf("Hello %s\r\n", $name);
        };
        
        $greet('World');
        $greet('PHP');
        ?>
        

        【讨论】:

          【解决方案6】:

          PHP 也有这些,从 5.3 开始。它们没有那么灵活(因为您不能使用$this),但仍然非常有用。

          Lisp 及其方言也有闭包。

          【讨论】:

            【解决方案7】:

            对于 C,它们可作为非标准扩展名blocks 使用。

            【讨论】:

              猜你喜欢
              • 2012-04-10
              • 1970-01-01
              • 1970-01-01
              • 2010-10-14
              • 2010-09-06
              • 1970-01-01
              • 1970-01-01
              • 2012-03-12
              • 2015-05-16
              相关资源
              最近更新 更多