Scala - 如何阅读方法签名

时间:2018-05-16 11:51:09

标签: scala methods

我是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) = {

...
...

}

由于

1 个答案:

答案 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) = {

事实上。该函数有三个参数组。

第一个实际上是空的,所以你只需用()来调用它。但它可能有一些参数,甚至是可选项,也许可以添加配置。

第二个是“回调”到“运行”(完成此基本设置后)。它本身是一个函数,将使用三个参数调用,ProducerStringSchema

第三个是你的代码,以“验证”所有这些的结果。它查看了三个参数并返回Result(可能表示一切都很好或出了什么问题)。