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