Когда использовать знак равенства в объявлении метода 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
для метода, который не имеет возвращаемого значения, способ выражения таких методов не учитывает тип результата и
равно знаку, следуя методу с блоком, заключенным в фигурные скобки. В
эта форма, метод выглядит как процедура, метод, который выполняется только
для его побочных эффектов.