我是 clojure 的新手,我想弄清楚 Jepsen 是做什么的,这是一个用于检查分布式系统一致性的软件。
- 我的问题是:
- 扩展协议有什么作用?
- 更具体地说,在Jepsen.Generator
op
中,Protocol
. - 在上下文中混合是什么意思
亲切的问候
我是 clojure 的新手,我想弄清楚 Jepsen 是做什么的,这是一个用于检查分布式系统一致性的软件。
op
中,Protocol
.亲切的问候
扩展协议有什么作用?
协议是一种抽象的东西,看起来像 Java 中的接口。它什么也不做,但其他一些实体可能会实现它。在 Java 中,您声明一个实现接口的类。deftype
在 Clojure 中,您可以使用声明或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]
. 这取决于它应该返回什么。例如,您可以参考第 46 行,其中为该clojure.lang.AFunction
类型实现其行为。由于我对 jepsen 不熟悉,所以我不能多说。
在上下文中混合是什么意思
我认为它的文档字符串和代码一样清晰。我收集了一个氏族。如果它为空,则结果将是一个名为 的特殊 Generator 实例void
。它是一种匿名类型,它扩展了生成器协议,仅nil
在调用时返回,op
无需任何计算。
如果gens
不为空,则代码返回一个 Generator 类型的实例,该实例具有这样的实现,在执行时op
采用随机数。gen
op
希望这会有所帮助。