最近看到了 Clojure 协议(protocol)的演示文稿,我对通过这种方式扩展现有类型的简洁方式印象深刻。
但是,我很确定已经在其他语言中看到过类似的方法,过了一段时间我发现它是 Groovy 类别。
比较一下:
@Category(String) class StringCategory {
String lower() {
return this.toLowerCase()
}
}
use (StringCategory) {
println("TeSt".lower())
assert "test" == "TeSt".lower()
}
与 Clojure 协议(protocol)等效(取自 mikera's answer below and tested in ideone.com )
(defprotocol Lowerable
(lower [x]))
(extend-protocol Lowerable
String
(lower [s]
(.toLowerCase s)))
(println (lower "HELLO"))
我的问题是:
免责声明:我是一个完整的 Clojure 新手!
最佳答案
这是使用协议(protocol)的粗略等效 Clojure 代码:
(defprotocol Lowerable
(lower [x]))
(extend-protocol Lowerable
String
(lower [s]
(.toLowerCase s)))
(lower "HELLO")
=> "hello"
关于 Clojure 协议(protocol)的主要区别(我相信这使它与 Groovy 类别版本不同)
lower
在 Rope 上工作. lower
是适当的一等函数。因此,您可以使用它来构建更高阶的抽象(通过更高阶的函数),这反过来将接受任何已扩展 Lowerable 协议(protocol)的参数。 Clojure 协议(protocol)实际上是一个相当独特的 solution to the Expression Problem (链接的视频很有趣)。我认为与另一种语言中的 Clojure 协议(protocol)最接近的等价物实际上是 Haskell 类型的类。即使这样也有点牵强,因为 Haskell 是静态类型的,而 Clojure 是动态类型的......
关于groovy - Clojure 协议(protocol)和 Groovy 类别之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935186/