Когда использовать знак равенства в объявлении метода 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 ответов:
Я на самом деле не согласен довольно сильно с Даниэлем. Я думаю, что неравный синтаксис должен никогда использоваться. Если ваш метод предоставляется как 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) }
одна вещь : представьте себе последнее утверждение метода, который должен возвращать единицу, не возвращает единицу. Использование неравного синтаксиса тогда очень удобно, я надеюсь, что это не будет устарело, поскольку я вижу несколько вариантов использования для него
С течением времени стиль по умолчанию изменился, и это было упомянуто во многих комментариях к ответам, рекомендуется в официальное руководство по стилю использовать
=
синтаксис для объявления функции.