Я пытаюсь передать функцию как параметр, но эта функция имеет несколько аргументов (одна из которых является функцией).scala - Передача функции, которая принимает другую функцию как параметр
Вот что я пытаюсь сделать в базовом примере Python:
def first(string1, string2, func):
func(string1, string2, third)
def second(string1, string2, func):
func(string1, string2)
def third(string1, string):
# operations go here
first("one", "two", second)
Моя попытка это в Scala было следующее:
def first(string1: String, string2: String, func: (Any, Any, Any) => Unit) = {
func(string1, string2, func)
}
def second(string1: String, string2: String, func: (Any, Any) => Unit) = {
func(string1, string2)
}
def third(string1: String, string2: String) = {
// operations
}
def main(args: Array[String]): Unit = {
first("one", "two", second)
}
Я получаю ошибку за попытку передать second
в first
с недостаточным количеством аргументов. Возможно ли реализовать эту функциональность в том же стиле, что и пример Python?
EDIT:
Я попытался заменить тело моего основного метода с first("one", "two", second _)
, и это дает мне ошибку несоответствия типов
типа несоответствия; найдено: (String, String (Любой, любой, любой) => Unit) => требуется Единица измерения: (Любой, любой, любой) => Unit
Любая идея, что здесь происходит?
Так фактическая программа, которую я буду делать имеет 7 функций, которые принимают другая функция как параметр, все они вложены в стиль моего примера кода. Я предполагаю, что сохранение стиля Python не очень практично с Scala? – kevin
@kevin - Да, прохождение вложенных обратных вызовов будет довольно уродливым. Если вы пытаетесь выполнить некоторые асинхронные операции, вы можете посмотреть фьючерсы. В противном случае для понимания и макросов можно использовать для выравнивания синтаксической структуры вашего кода. – Lee
Я пошел дальше и принял ваш ответ, так как он решил мою проблему. Есть ли какой-нибудь пример, на который вы могли бы указать мне, чтобы использовать макросы? – kevin