Вопросы о заполнителях в Scala - PullRequest
3 голосов
/ 29 января 2012

Рассмотрим следующее определение в Scala:

val f = ((_: Int) + 1).toString()

Код присваивает строковому представлению функции литерал _ + 1, что вполне естественно, за исключением того, что это не то, что мне нужно. я намеревался определить функцию, которая принимает аргумент int, увеличивает его на 1 и возвращает формат строки.

Чтобы устранить неоднозначность, я должен написать лямбда-выражение с явными параметрами:

val g = (x: Int) => (x + 1).toString()

Так можно ли сделать вывод, что синтаксис заполнителя не подходит для литералов сложных функций? Или есть какое-то правило, определяющее область действия литерала функции? Кажется, заполнители не могут быть вложены в круглые скобки (кроме тех, которые необходимы для определения его типа) внутри литерала функции

Ответы [ 2 ]

7 голосов
/ 29 января 2012

Да, вы правы, полагая, что синтаксис-заполнитель бесполезен помимо простых функциональных литералов.

Для чего стоит, упомянутый вами конкретный случай может быть записан с использованием синтаксиса заполнителя и композиции функций.

scala> val f = ((_: Int) + 1) andThen (_.toString)
f: Int => java.lang.String = <function1>

scala> f(34)
res14: java.lang.String = 35
3 голосов
/ 29 января 2012

Кажется, заполнители не могут быть вложены в круглые скобки (кроме тех, которые необходимы для определения его типа) в литерал функции

Это правильно.См. Правила для синтаксиса заполнителя и пример использования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...