为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

呼唤远方 2019-03-20 18:14:23

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

查看完整描述

6 回答

?
千万里不及你

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


查看完整回答
反对 回复 2019-04-15
?
www说

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

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


查看完整回答
反对 回复 2019-04-15
?
海绵宝宝撒

我想说 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();

       }

     }));

这里 Predicate 和 Function 匿名类就是「闭包」,分别实现了 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 表达式,估计会好一些。


查看完整回答
反对 回复 2019-04-15
?
倚天杖

gcc直接可以用蛤~


查看完整回答
反对 回复 2019-04-15
?
尚方宝剑之说

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);

        }

}


查看完整回答
反对 回复 2019-04-15
?
慕码人2483693

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


查看完整回答
反对 回复 2019-04-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信