Я немного запутался в использовании параметров «по одному имени» в Scala. Пожалуйста, помогите мне понять, что здесь происходит. Рассмотрим следующий пример использования вызова по имени параметра:Почему параметр «по имени» указывает параметр типа Int вместо() => Int
def param = {println("Param evaluates"); 40}
def lazyEval(x: => Int) = {
println("lazy");
x
}
val s = lazyEval(param + 2)
// s = 42
У меня есть несколько вопрос, связанный друг с другом об этом:
lazyEval
метод ожидает параметр типа=> Int
, так почемуparam + 2
операция является законным? Почему мы можем добавить целое число 2 к объекту с типом=> Int
(im мое понимание под капотом это<function0>
) при вызове методаlazyEval
? Как мне подсказывает IDE, функцияlazyEval
ожидает параметр типаInt
вместо=> Int
(какого черта?).Почему после изменения типа обратного вызова от
=> Int
до() => Int
код не компилируется? Являются ли эти 2 типа разными? Хотя короткая версия ('=> Int') является просто синтаксическим сахаром.После некоторых игр с кодом я, наконец, смог изменить код, поэтому он будет скомпилирован с
() => Int
. Этот способ более интуитивно понятен для меня.
.
def param = {println("Param evaluates"); 40}
def lazyEval(x:() => Int) = { // changed type to '() => Int'
println("lazy");
x() // explicitly calling function using parentheses '()'
}
val s = lazyEval(param _) // adding underscore after method name and removing `+2`
Что разница между этой версией и первый (с обратным => Int
типа)? Почему в этой версии мы не можем добавить целое число со значением 2
и функцию param
(я имею в виду это lazyEval(param _ + 2)
)? И что означает подчёркивание после имени метода? (Я предполагаю, что это используется, чтобы передать методу себя, а не его возвращать значение)
Спасибо помощи
Я не знаю, почему вы сказали бы, что '=> Int' не является типом или просто синтаксисом. –
Вы правы. Это. –
@ som-snytt Я проснулся в 4:30 после того, как я мечтал написать этот ответ, и отчаянно проверил его со своего телефона, чтобы найти ваш недавно сделанный комментарий. Естественно, я удалился на свой рабочий компьютер с моего телефона, чтобы использовать REPL, и проверить его, так как я не мог вернуться спать, не зная. Теперь, когда я в более ясном состоянии, я исправил свой ответ, чтобы не сказать такие неправильные вещи о '=> Int'. –