2016-04-13 4 views
1

Предположительно у меня есть метод, который имеет один параметр по умолчанию. Я хочу передать это как аргумент другому методу. Как я могу вызвать метод pass-in с его параметром по умолчанию?Вызов методов с параметрами по умолчанию в функции высших порядков scala

def printNum(i: Int = 4): Unit = { 
    println(i) 
} 

def doStuff(printFunc: (Int) => Unit): Unit = { 
    // How to call printFunc with its default parameter 
    printFunc() 
} 

doStuff(printNum) 

ответ

1

Я боюсь, что вы не можете. Параметр по умолчанию - это свойство методов, подобно именованным аргументам и тому подобным. Когда вы передаете его как функцию, он преобразуется в функцию с расширением eta, а функции не имеют параметров по умолчанию.

Просто посмотрите на это:

def doStuff(printFunc: Int => Unit): Unit = ??? 

Это метод, который ожидает функция Int => Unit, функцию Int => Unit. Поэтому, если вы можете передать произвольную функцию, как компилятор узнает, что он имеет параметр по умолчанию.

Вы можете создать обертку для Function, которая имеет значение по умолчанию и перегружено apply. Но по-прежнему нелегко вытащить аргумент по умолчанию из метода, чтобы сделать его прозрачным.

Что вы можете Исли сделать, это создать еще один метод

def printDefaultNum(): Unit = { 
    printNum(4) 
} 

И сделать doStuff принять Function0, как вы на самом деле хотите назвать это без каких-либо параметров.

def doStuff(printFunc:() => Unit): Unit = { 
    printFunc() 
} 

doStuff(printDefaultNum)