2015-09-01 2 views
3

Почему doSmth(() => s) не компилируется? Почему остальная часть кода выводит «значение»? Есть ли способ вызвать вторую функцию (с параметром «по вызову»)?Функция перегрузки с параметром и функцией по вызову с параметром байта

object Test { 
    def main (args: Array[String]){ 
    lazy val s: String = "" 
    doSmth(s) 
    doSmth("") 
    doSmth(() => s) 
    } 

    def doSmth(p: String): Unit = { 
    println("value!") 
    } 
    def doSmth(p: => String): Unit = { 
    println("call by name!") 
    } 
} 

ответ

0

Следующий код работает и составляет, как и ожидалось:

def doSmth(p: String): Unit = { 
    println("value!") 
} 
def doSmth(p:() => String): Unit = { 
    println("call by name!") 
} 

lazy val s: String = "" 
doSmth(s) 
doSmth("") 
doSmth(() => s) 

Обратите внимание, что если у вас есть два варианта метода, один из которых является по имени и тот, который по значению, есть чтобы Скала не знала, что вы имеете в виду. Вместо этого вторая версия метода принимает функцию от единицы к строке.

+0

хорошо, даже с исходной версией кода, 'doSmth (" ")' output "value!" –

+0

Один из вопросов, которые я задавал, могу ли я называть 'doSmth()' и сделать вывод «вызовом по имени!» без изменения исходной функции –

+0

Если у вас есть doSmth, определяемый как вызов как по вызову String, так и вызов по ссылке String, компилятор не может определить, какую версию выполнить. Если в моем примере вторая версия doSmth принимает функцию из единицы в строку, то вы можете выбрать передачу строки или функцию, которая дает строку, компилятор может отличить эту разницу. – mattinbits