Может кто -нибудь объяснить, что здесь происходит?
Вопрос
Вот код:
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String
scala> foo(a => a.toString)
res0: (Unit) => String = <function1>
Я предполагаю, что A имеет единицу типа, но разве UNIT USE ONEO? Скрыт ли класс устройства?
Решение
Unit
является AnyVal
, как Int
. Анкет Его единственным членом является буквальный, написанный как ()
. Анкет Например:
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: Unit => String)Unit => String
scala> foo(a => a.toString)
res0: Unit => String = <function1>
scala> res0(())
res1: String = ()
Другие советы
Работаю из ваших примеров ...
def foo(bar: Unit => String) = {bar}
Это определяет foo
метод, который принимает функцию из Unit
к String
как единственный аргумент, и просто возвращает тот же аргумент.
foo(a => a.toString)
a => a.toString
Определяет функцию встроенной. Потому что тип инференции знает, что функция Unit => String
Ожидается в этом месте, он делает a
быть типом Unit
.
Это призыв foo
Затем возвращает анонимную функцию, которую вы только что определили.
Мне любопытно, чего именно вы пытались достичь здесь? Или вы только что изучали синтаксис Скалы?
В Скале Unit
эквивалентен Java void
. Анкет Вы определили функцию, которая принимает другую функцию без параметров и возвращает String
.
Это эквивалентно def foo(bar: => String);
Или же def foo(bar: () => String)
В Скале ()
это ярлык для Unit
Ответ, данный Кевином Райтом, совершенно правильный, но для дальнейшего его разрушения:
Первая строка объявляет функцию, вызванную foo
. foo
принимает в качестве аргумента другую функцию, bar
это само по себе принимает Unit
и возвращает а String
. Анкет Вообще говоря, Unit
в скала имеет то же значение, что и void
делает на многих других языках, так что вы можете сказать по большей части, что bar
функция, которая не принимает никаких аргументов и возвращает String
.
Тело foo
Функция просто возвращает полученный аргумент. Следовательно, Scala делает это foo
возвращает функцию, которая берет Unit
и возвращает а String
.
Вторые командные вызовы foo
с функцией a => a.toString
как его аргумент. a
предполагается, что он тип Unit
. Анкет Если Unit
был точным аналогом для void
, это не сработает. Вы не можете позвонить toString
в отсутствие чего -то. Однако, Unit
ведет себя немного по -другому, именно для подобных ситуаций, и a
будет предоставлен экземпляр Unit
. Анкет Этот экземпляр на самом деле не сможет сделать много, но он сможет иметь toString
призвал это. Таким образом, результатом второй команды будет функция, которая возвращает результат toString
призвал Unit
экземпляр, который: "()"