Scala - как читать сигнатуры метода - PullRequest
0 голосов
/ 16 мая 2018

Я новичок в 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 (только общий поток, подпись и возврат).

например, почему здесь 2 блока кода: basicSetup() { ... } { ...} (как это выполняется?)

private def basicSetup()
   (run: (Producer, String, Schema) => Unit)
   (verify: (ProducerRecord[String, Array[Byte]], GenericRecord, Schema) => Result) = {

...
...

}

Спасибо

1 Ответ

0 голосов
/ 16 мая 2018

Было бы полезно взглянуть на определение 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 (по-видимому, указывая, что все хорошо или что пошло не так).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...