2016-03-30 2 views
4

Допустим, у меня есть:Тип подписи для функции Котлин с параметрами по умолчанию

fun addInvoker(adder:() -> Int = ::add): Int{ 
    return adder() 
} 

fun add(num1:Int = 1, num2:Int = 1): Int{ 
    return num1 + num2 
} 

Я получаю сообщение об ошибке, так как :: добавить два параметра, но подпись addInvoker требует, чтобы иметь нулевые параметры. Однако, если я изменить его на:

fun addInvoker(adder: (Int, Int) -> Int = ::add): Int{ 
    return adder() 
} 

fun add(num1:Int = 1, num2:Int = 1): Int{ 
    return num1 + num2 
} 

Тогда я не могу ссылаться на сумматор(), то есть, ссылающегося добавить свои аргументы по умолчанию.

Итак, есть ли способ, которым я могу сделать: добавить аргумент по умолчанию для invokeAdder, но все же вызвать add с adder(), вызывая при этом аргументы по умолчанию?

+0

попробуйте сделать обертку с параметрами параметров с нулевыми параметрами по сравнению с сумматором, я не знаю, есть ли у вас синтаксический сахар в kotlin для создания ad hoc анонимных функций в другом объявлении функции. Что-то вроде '.... = :: (() -> (add()))): Int {.....' –

+0

понятия не имею о языке, но в целом создание обертки, похоже, решает вашу проблему. – HuStmpHrrr

+0

Yup, создавая обертку, работает, но мне интересно, есть ли способ сделать это с помощью сигнатур типов. Я ожидаю, что это невозможно. – pondermatic

ответ

7

Вы можете сделать лямбда вашего add, которая будет функцией без аргументов и вызовет add со своими аргументами по умолчанию: { add() }.

Полный код:

fun addInvoker(adder:() -> Int = { add() }): Int { 
    return adder() 
} 

fun add(num1: Int = 1, num2: Int = 1): Int { 
    return num1 + num2 
} 

В Котлин, функции с аргументами по умолчанию не имеют особого представления в системе типов, так что единственный вариант, чтобы сделать обертки, проходящие лишь часть аргументов им:

val add0:() -> Int = { add() } 
val add1: (Int) -> Int = { add(num1 = it) } 
val add2: (Int) -> Int = { add(num2 = it) } 

 Смежные вопросы

  • Нет связанных вопросов^_^