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


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

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

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

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

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

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

7 80

7 ответов:

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

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

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

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

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

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

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

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

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

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

trait Foo {
  def bar(s: String)
}

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

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

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

для методов, Руководство По Стилю Scala рекомендует синтаксис equals в отличие от синтаксиса процедуры

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

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

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

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

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

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