Как вызвать эту Scala функцию, когда «ошибка: блок не принимает параметры» - PullRequest
1 голос
/ 15 января 2020

Когда я определяю эту функцию, я могу вызвать ее без проблем:

scala> val c = (_: String) + "sd"
c: String => String = <function1>

scala> c("1")
res13: String = 1sd

Однако, если я разрешу вышеуказанной функции print результат, не возвращая ее, у меня будет следующая ошибка:

scala> val b = print((_: String) + "sd")
<function1>b: Unit = ()

scala> b("1")
<console>:26: error: Unit does not take parameters
       b("1")
        ^

Я знаю, что системный метод print возвращает тип Unit, но не должна ли функция b быть функцией, которую можно вызывать с аргументом, как я определил? Почему вышеуказанную функцию b нельзя вызвать с помощью b("1")?

Как понять и решить проблему? Спасибо.

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Действительно, как вы уже обнаружили,

print((_: String) + "sd")

расширяется до

print((x: String) => x + "sd")

вместо желаемого

(x: String) => print(x + "sd")

, поскольку _ связывается с ограничитель внутреннего выражения () или {}.

1 голос
/ 15 января 2020

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

Анонимная функция от String до String.

scala> (_: String) + "sd"
res0: String => String = $$Lambda$1156/0x00000008406c1040@6b8bdcc6

Печать String представления анонимной функции.

scala> println((_: String) + "sd")
$line10.$read$$iw$$iw$$$Lambda$1158/0x00000008406c3040@31f5b923

Печать String представления анонимной функции. Сохраните результат в переменной b.

scala> val b = println((_: String) + "sd")
$line11.$read$$iw$$iw$$$Lambda$1159/0x00000008406a7040@173cfb01
b: Unit = ()

Переданный параметр print() и println() является вызовом по ссылке, а не вызовом по имени, поэтому он полностью оценивается при вызове сайт перед передачей на print(). В этом случае print() получает функцию, она не становится частью более крупной функции.

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