Объяснение "несвязанного параметра-заполнителя"
Вопрос
Почему случай 2 вызывает "несвязанный параметр-заполнитель", а случай 1 - в порядке?
Случай 1
val h: (Int => Int) = (x:Int) => { scala.util.Random.nextInt(x) }
val _h: (Int => Int) = { scala.util.Random.nextInt(_) }
h(5) // 3
_h(5) // 3
Случай 2
val f: (Int => Int) = (x:Int) => { x }
f(5) // 5
// Causes error
val _f: (Int => Int) = { _ } <----- unbound placeholder parameter
2 ответа
Решение
.nextInt(_)
не является примером использования заполнителя. В этом случае подчеркивание_
используется для "эта-расширения" nextInt()
метод, т.е. продвижение метода до надлежащей функции. Результат эквивалентен следующему:
val _h: (Int => Int) = util.Random.nextInt
Чтобы получить свой _f()
код для работы, вы могли бы это сделать.
val _f: (Int => Int) = identity
_
никогда не интерпретируется как x => x
в Scala.
Если я правильно понимаю часть языковой спецификации, в которой говорится о "привязке разделов подчеркивания", это именно потому, что Scala резервирует_
для частичного применения. Как в случаеscala.util.Random.nextInt(_)
это означает x => nextInt(x)
и нет nextInt(x => x)
.