js go python 实现闭包貌似很简单
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
现代的Java已经支持闭包了。
标准的C不支持闭包。gcc和clang倒是有blocks扩展。
我想说 Java 的「闭包」很蛋疼... 被闭包引用的「域外」变量只能是 final 的,而且可读性很差,引用 guava的一个例子,自己比较下:
final
「二比青年版」:
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 中慎用这种「编码模式」!
Predicate
Function
「普通青年版」:
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 表达式,估计会好一些。
gcc直接可以用蛤~
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); } }
C里不允许在函数体内定义函数,应该是不能实现了。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(6)
c语言不熟悉,java中的闭包是通过“接口+内部类”实现的
以下是网上的一个例子
可以参考下这个博客http://www.cnblogs.com/chenjunbiao/archive/2011/01/26/1944417.html
现代的Java已经支持闭包了。
标准的C不支持闭包。gcc和clang倒是有blocks扩展。
我想说 Java 的「闭包」很蛋疼... 被闭包引用的「域外」变量只能是
final
的,而且可读性很差,引用 guava的一个例子,自己比较下:「二比青年版」:
这里
Predicate
和Function
匿名类就是「闭包」,分别实现了Predicate
接口和Function
接口。看看这一坨代码... Java 中慎用这种「编码模式」!「普通青年版」:
短平快,可读性好!
「文艺青年版」:
当然,对于动态语言来说,太小菜了。
以后 Java 8 普及了,支持 Lambda 表达式,估计会好一些。
gcc直接可以用蛤~
C语言实现闭包函数,可以参考《C语言接口与实现》一书,作者多次使用闭包,不过作者说的闭包应该指的是回调函数。和Java估计不大相同。比如下面的这个函数Table_map,其中的回调函数apply,可以在C中称为一个闭包。注:以上是作者的书中,中译本的说法~
C里不允许在函数体内定义函数,应该是不能实现了。