我是Scala的新手并尝试了解以下方法:
def method1 = {
val key = "k1"
val value = "v1"
basicSetup() { (a, b, c) =>
val json = s"""{"field1":"$value"}"""
someMethodTest.send(a, b, json, c)
} { (record, avroObject, schema) =>
if (avroObject.get("field1").toString != value) {
failure("failed")
} else {
success
}
}
}
到目前为止,我一直致力于简单的方法,并了解何时是一个简单的调用和返回,但在这里它看起来像捆绑的东西。
需要帮助来了解如何从basicSetup
行读取它(只是一般流程,签名和返回)。
e.g。为什么这里有两个代码块:basicSetup() { ... } { ...}
(它是如何执行的?)
private def basicSetup()
(run: (Producer, String, Schema) => Unit)
(verify: (ProducerRecord[String, Array[Byte]], GenericRecord, Schema) => Result) = {
...
...
}
由于
答案 0 :(得分:2)
查看basicSetup
的定义会很有帮助,但它看起来像是一个带有三个参数组的方法,其中最后两个本身就是函数(使basicSetup
成为一个高阶函数)。
第一个参数组为空()
。
第二个和第三个是两个“闭包”或代码块或匿名函数。
您可以将其重写为
// give names to these blocks
def doSomethingWithABC(a:A, b:B, c:C) = ???
def doSomethingWithAvro(record: R, avro: O, schema: S) = ???
basicSetup()(doSomethingWithABC)(doSomethingWithAvro)
为什么这里有2个代码块?
这是使函数调用(特别是高阶函数调用)看起来更像“内置”构造的语法糖。所以你可以推出自己的控制流方法。这里的关键字是DSL。
这两个块是basicSetup
的参数。它们可以看起来只是裸块(没有任何参数括号),使其更简洁(自然,一旦你习惯了它)。
更新(现在我们有签名):
private def basicSetup()
(run: (Producer, String, Schema) => Unit)
(verify: (ProducerRecord[String, Array[Byte]], GenericRecord, Schema) => Result) = {
事实上。该函数有三个参数组。
第一个实际上是空的,所以你只需用()
来调用它。但它可能有一些参数,甚至是可选项,也许可以添加配置。
第二个是“回调”到“运行”(完成此基本设置后)。它本身是一个函数,将使用三个参数调用,Producer
,String
和Schema
。
第三个是你的代码,以“验证”所有这些的结果。它查看了三个参数并返回Result
(可能表示一切都很好或出了什么问题)。