Может кто -нибудь объяснить, что здесь происходит?

StackOverflow https://stackoverflow.com/questions/7322749

  •  27-10-2019
  •  | 
  •  

Вопрос

Вот код:

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 экземпляр, который: "()"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top