我是clojure的新手,我正在试图弄清楚Jepsen做了什么,这是一个用来检查分布式系统一致性的软件。
op
中的Protocol
是什么。亲切的问候
答案 0 :(得分:1)
extend-protocol有什么作用?
协议是一个抽象的东西,看起来像Java中的接口。它什么都不做,但其他一些实体可能会实现它。在Java中,您声明了一个实现接口的类。在Clojure中,你扩展了一个
具有自定义类型的特定协议,其中deftype
或defrecord
在其上调用extend-protocol
。
使用类型扩展协议时,需要指定该协议中提到的签名的实现。
一个很好的例子可能是JSON序列化。说,协议如下所示:
(defprotocol JSON
(to-json [obj]))
如果您对任何值调用(to-json ...)
,则会发出错误消息,指出该类型没有to-json
实施。你需要扩展它:
(extend-protocol JSON
Integer
(to-json [obj] (str obj))
Boolean
(to-json [obj]
(if obj "true" "false")))
现在,调用(to-json 42)
和(to-json false)
即可。您可以为其余类型扩展该协议:浮点数,数组,映射等。
协议中的操作是什么
协议没有实现,只有签名。 os
是某个函数的签名,只需要三个参数:[gen test process]
。它取决于它应该返回什么。例如,您可以引用line #46为clojure.lang.AFunction
类型实现其行为的位置。由于我对jepsen不熟悉,所以我不能多说。
混合在上下文中意味着什么
我认为它的文档字符串非常清晰,代码也是如此。我收集了一群人。如果它为空,则结果将是名为void
的特殊Generator实例。它是一种匿名类型,在没有任何计算的情况下调用nil
时,扩展了Generator协议只返回op
。
gens
不为空,代码返回一个Generator类型的实例,其中op
实现在执行gen
时采用随机op
。
希望这会有所帮助。