看完后里奇·希基的采访 http://www.infoq.com/interviews/hickey-clojure-protocols on 协议 http://clojure.org/protocols在 Clojure 1.2 中,对 Clojure 知之甚少,我对 Clojure 协议有一些疑问:
- 他们是否打算做同样的事情结构类型 http://codemonkeyism.com/scala-goodness-structural-typing/在斯卡拉?与结构类型相比,协议有哪些优势(性能、灵活性、代码清晰度等)?它们是通过反思来实现的吗?
- 关于与 Scala 的互操作性问题:Scala 中可以使用协议代替结构类型吗?它们可以在 Scala 中扩展(如果“扩展”术语可以应用于协议)吗?
完全不相关。
Scala 是一种静态类型语言。 Clojure 是一种动态类型语言。这种差异从根本上塑造了两者。
结构类型是静态类型,句号。它们只是让编译器静态证明对象将具有特定结构的一种方法(我在这里说证明,但强制转换一如既往会导致虚假证明)。
Clojure 中的协议是一种创建动态调度的方法,它比反射或在映射中查找内容要快得多。从语义意义上来说,它们并没有真正扩展 Clojure 的功能,但在操作上它们比以前使用的机制要快得多。
Scala 特性更接近协议,Java 接口也是如此,但同样存在静态与动态问题。 Scala 特征必须在编译时与类关联,类似于 Java 接口。 Clojure 协议甚至可以由第三方在运行时添加到数据类型中。
通过包装器/代理模式或动态代理等机制,在 Java 和 Scala 中可以实现类似 Clojure 协议的功能(http://download.oracle.com/javase/1.4.2/docs/guide/reflection/proxy.html http://download.oracle.com/javase/1.4.2/docs/guide/reflection/proxy.html)。但这些会比 Clojure 协议笨拙得多,而且正确获取对象标识也很棘手。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)