Когда использовать знак равенства в объявлении метода Scala?

С знаком равенства:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}

Без знака равенства:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}

Обе указанные программы выполняются одинаково. В сообщении блога Вещи, которые мне не нравятся в Scala Я читал, что, когда знак равенства отсутствует, метод вернет Unit ( то же, что и Java void), поэтому методы, возвращающие значение, должны использовать знак равенства. Но методы, которые не возвращают значение, могут быть записаны в любом случае.

Какова наилучшая практика использования знака равенства в Scala методах, которые не возвращают значение?

Ответ 1

Я действительно очень не согласен с Дэниелом. Я думаю, что неравномерный синтаксис никогда не должен использоваться. Если ваш метод отображается как API, и вас беспокоит случайное возвращение неправильного типа, добавьте явное аннотацию типа:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}

Неравномерный синтаксис короче и может выглядеть "чище", но я думаю, что это просто добавляет возможность путаницы. Я иногда забыл добавить знак равенства и полагал, что мой метод возвращал значение, когда на самом деле он возвращал Unit. Поскольку синтаксисы не равных и равносильных типов выглядят так же похожи, легко пропустить эту проблему.

Несмотря на то, что мне стоит немного больше работы, я предпочитаю явные аннотации типов, когда они имеют значение (а именно, открытые интерфейсы).

Ответ 2

UPDATE: от Scala -2.10, использование знака равенства является предпочтительным. Старый ответ:

Методы, возвращающие Unit, должны всегда использовать синтаксис без равенства. Это позволяет избежать возможных ошибок при внедрении в API. Например, вы могли бы случайно сделать что-то вроде этого:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}

Тривиальный пример, конечно, но вы можете видеть, как это может быть проблемой. Поскольку последнее выражение не возвращает Unit, сам метод будет иметь тип возврата, отличный от Unit. Это раскрывается в публичном API и может вызвать другие проблемы в будущем. С синтаксисом без равенства не имеет значения, что такое последнее выражение, Scala исправляет возвращаемый тип как Unit.

Он также очищает два символа.:-) Я также склонен думать, что синтаксис без равенства делает код немного легче читать. Более очевидно, что рассматриваемый метод возвращает Unit вместо некоторого полезного значения.

В соответствующем примечании имеется аналогичный синтаксис для абстрактных методов:

trait Foo {
  def bar(s: String)
}

Метод bar имеет подпись String=>Unit. Scala делает это, когда вы опускаете аннотацию типа на абстрактном элементе. Еще раз, это чище, и (я думаю) легче читать.

Ответ 3

Вы должны использовать знак равенства в объявлении вызовов, кроме определений, возвращающих Unit.

В этом последнем случае вы можете отказаться от знака равенства. Однако этот синтаксис может быть устаревшим, поэтому его лучше избегать. Использование знака равенства и объявление возвращаемого типа всегда будут работать.

Ответ 4

Для методов Scala Руководство по стилю рекомендует синтаксис равных в отличие от синтаксиса процедуры

Синтаксис процедуры

     

Избегайте синтаксиса процедуры, поскольку он имеет тенденцию к запутыванию при очень небольшом усилении в краткости.

// don't do this
def printBar(bar: Baz) {
  println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
  println(bar)
}

Ответ 5

Одна вещь: представьте последнее утверждение метода, который должен вернуть Unit, не возвращает Unit. Использование неравного синтаксиса тогда очень удобно, я надеюсь, что это не будет устаревшим, поскольку я вижу несколько вариантов использования для него

Ответ 6

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

Ответ 7

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