Может кто-нибудь объяснить, что здесь происходит? - PullRequest
2 голосов
/ 06 сентября 2011

Вот код:

scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String

scala> foo(a => a.toString)
res0: (Unit) => String = <function1>

Я предполагаю, что имеет тип Unit, но не является ли Unit объектом? Скрыт ли класс юнитов?

Ответы [ 4 ]

4 голосов
/ 06 сентября 2011

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 = ()
4 голосов
/ 06 сентября 2011

Работая на ваших примерах ...

def foo(bar: Unit => String) = {bar}

Это определяет метод foo, который принимает функцию от Unit до String в качестве единственного аргумента и просто возвращает тот же аргумент.

foo(a => a.toString)

a => a.toString определяет встроенную функцию. Поскольку механизм вывода типов знает, что в этом месте ожидается функция Unit => String, он выводит a типа Unit.

Этот вызов foo затем возвращает анонимную функцию, которую вы только что определили.

Мне любопытно, чего именно вы пытались достичь здесь? Или вы просто изучали синтаксис Scala?

2 голосов
/ 06 сентября 2011

Ответ, данный Кевином Райтом, совершенно верен, но если разбить его дальше:

Первая строка объявляет функцию с именем foo. foo принимает в качестве аргумента другую функцию, bar, которая сама принимает Unit и возвращает String. Вообще говоря, Unit в scala имеет то же значение, что и void во многих других языках, поэтому вы можете сказать, что по большей части bar является функцией, которая не принимает аргументов и возвращает String.

Тело функции foo просто возвращает полученный аргумент. Следовательно, Scala делает вывод, что foo возвращает функцию, которая принимает Unit и возвращает String.

Вторая команда вызывает foo с функцией a => a.toString в качестве аргумента. Предполагается, что a относится к типу Unit. Если бы Unit был точным аналогом void, это не сработало бы. Вы не можете позвонить toString при отсутствии чего-либо. Тем не менее, Unit ведет себя немного по-другому, именно для таких ситуаций, и a будет дан экземпляр Unit. Этот экземпляр на самом деле не сможет многое сделать, но он сможет вызывать toString. Таким образом, результатом второй команды будет функция, которая возвращает результат toString, вызванный для экземпляра Unit, который: "()"

2 голосов
/ 06 сентября 2011

В Scala Unit эквивалентно Java void.Вы определили функцию, которая принимает другую функцию без параметров и возвращает String.

Это эквивалентно def foo(bar: => String); Или def foo(bar: () => String)

В Scala () является ярлыкомдля Unit

...