c语言和java如何实现闭包?

发布于 2022-08-28 11:25:44 字数 31 浏览 23 评论 0

js go python 实现闭包貌似很简单

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

忆依然 2022-09-04 11:25:44

c语言不熟悉,java中的闭包是通过“接口+内部类”实现的
以下是网上的一个例子

public class DemoClass1 {
    private int length =0;

    //private|public
    private class InnerClass implements ILog
    {
        @Override
        public void Write(String message) {
            //DemoClass1.this.length = message.length();
            length = message.length();
            System.out.println("DemoClass1.InnerClass:" + length);
        }
    }

    public ILog logger() {
        return new InnerClass();
    }

    public static void main(String[] args){
        DemoClass1 demoClass1 = new DemoClass1();
        demoClass1.logger().Write("abc");

        //.new
        DemoClass1 dc1 = new DemoClass1();
        InnerClass ic = dc1.new InnerClass();
        ic.Write("abcde");
    }
}

可以参考下这个博客http://www.cnblogs.com/chenjunbiao/archive/2011/01/26/1944417.html

っ〆星空下的拥抱 2022-09-04 11:25:44

现代的Java已经支持闭包了。

标准的C不支持闭包。gcc和clang倒是有blocks扩展。

仅此而已 2022-09-04 11:25:44

我想说 Java 的「闭包」很蛋疼... 被闭包引用的「域外」变量只能是 final 的,而且可读性很差,引用 guava的一个例子,自己比较下:

「二比青年版」:

Multiset<Integer> lengths = HashMultiset.create(
  FluentIterable.from(strings)
    .filter(new Predicate<String>() {
       public boolean apply(String string) {
         return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);
       }
     })
    .transform(new Function<String, Integer>() {
       public Integer apply(String string) {
         return string.length();
       }
     }));

这里 PredicateFunction 匿名类就是「闭包」,分别实现了 Predicate 接口和 Function 接口。看看这一坨代码... Java 中慎用这种「编码模式」!

「普通青年版」:

Multiset<Integer> lengths = HashMultiset.create();
for (String string : strings) {
  if (CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string)) {
    lengths.add(string.length());
  }
}

短平快,可读性好!

「文艺青年版」:

(->> strings
    (filter #(.matchesAllOf % CharMatcher/JAVA_UPPER_CASE))
    (map #(.length %))
    (HashMultiset/create))

当然,对于动态语言来说,太小菜了。

以后 Java 8 普及了,支持 Lambda 表达式,估计会好一些。

紙鸢 2022-09-04 11:25:44

gcc直接可以用蛤~

心欲静而疯不止 2022-09-04 11:25:44

C语言实现闭包函数,可以参考《C语言接口与实现》一书,作者多次使用闭包,不过作者说的闭包应该指的是回调函数。和Java估计不大相同。比如下面的这个函数Table_map,其中的回调函数apply,可以在C中称为一个闭包。注:以上是作者的书中,中译本的说法~

void Table_map(T table,
    void apply(const void *key, void **value, void *cl),
    void *cl) {
    int i;
    unsigned stamp;
    struct binding *p;
    assert(table);
    assert(apply);
    stamp = table->timestamp;
    for (i = 0; i < table->size; i++)
        for (p = table->buckets[i]; p; p = p->link) {
            apply(p->key, &p->value, cl);
            assert(table->timestamp == stamp);
        }
}
锦上情书 2022-09-04 11:25:44

C里不允许在函数体内定义函数,应该是不能实现了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文