2013-02-14 3 views
1

Есть ли разница между этими двумя ниже ..Scala - DEF и без =

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

scala> def foo() {} 
foo:()Unit 

Они кажутся одинаковыми.
Есть ли причина, по которой оба поддерживаются?

+0

Связанный: http://stackoverflow.com/questions/1661817/scala-def-foo-1-vs-def-foo-1 –

+0

Последняя форма может использоваться только для определения функций, возвращающих единицу. Первый используется для всех других функций. –

+0

Связанные: http://stackoverflow.com/questions/944111/when-to-use-the-equals-sign-in-a-scala-method-declaration –

ответ

5
def foo() {} 

эквивалентно (и обеспечивает)

def foo(): Unit = {} 

в то время как

def foo() = {} 

будет применяться тип infering, чтобы определить тип результата из тела метода.

Таким образом, с двумя первыми вариантами Unit является единственным допустимым типом возврата, а в третьем тип возврата зависит от реализации.

+0

Aaah, фантастическое объяснение. Я не знал, что возвращаемые типы могут быть выведены, спасибо Mef! –

+0

Это одна из многих удивительных вещей языка Scala :-) Стоит отметить, что для методов/функций, по крайней мере, для вашего общедоступного API, тип возвращаемого значения все равно должен отображаться, чтобы быть приятным для читателей вашего кода/API , – adelbertc

+1

@SeanConnolly: Действительно, в большинстве случаев возвращаемые типы могут быть выведены компилятором (не может, если он является прямым рекурсивным). Но часто не стоит полагаться на это. Существует две причины не полагаться на вывод типа для методов: 1) Явные типы результатов имеют значение документации; 2) Предполагаемые типы могут быть уже или более сложными, чем вам нравится. Пример (2) возвращает «HashMap». Вероятно, вы не хотите, чтобы ваш контракт API указывал такой конкретный тип и отсутствовал явная аннотация с типом возвращаемого типа, вы будете привязаны к этому конкретному типу, чтобы вы не нарушили его. –

Смежные вопросы