Зачем использовать фигурные скобки над скобками?
Во многих примерах Scala я вижу, что люди используют фигурные скобки в местах, которые я нахожу совершенно странными, когда одно и то же утверждение можно легко написать с помощью скобок.
Пример:
lst foreach (x => println(s"the value returned is: $x")) // parens
lst foreach {x => println(s"you get the idea, $x")} // braces
Я понимаю, что вы можете использовать фигурные скобки в качестве альтернативы скобкам, просто потому, что это позволяет вам написать заявление в несколько строк:
val res = for {
x <- coll1
y <- coll2
} yield (x, y)
- Так, когда это написано в одной строке, есть ли какая-то внутренняя причина использовать одну над другой?
- В итоге результат должен быть таким же, или я что-то упустил?
- Или это просто вопрос стиля и / или личного вкуса?
3 ответа
В целом, есть много случаев, когда вы предпочитаете фигурные скобки (например, многострочные выражения, для понимания), но давайте поговорим конкретно о
когда это написано в одной строке, есть ли какая-то внутренняя причина использовать одну над другой
Во втором случае это не просто фигурные скобки, вместо скобок, это фигурные скобки с опущенными скобками. Scala позволяет иногда пропустить круглые скобки, а более поздний синтаксис используется для доступа к тонкостям, которые вы получили в частичных функциях (а именно, в сопоставлении с образцом), поэтому
lst foreach {x => println(s"you get the idea, $x")}
на самом деле
lst foreach({x => println(s"you get the idea, $x")})
который, как я уже сказал, может быть полезен для сопоставления с образцом POV:
val map = Map("foo" -> "bar")
map foreach { case (k, v) => println(s"key: $k, value: $v") }
// which is not possible with the usual parenthesis
Это вопрос стиля кодирования. Посмотрите на http://www.codecommit.com/scala-style-guide.pdf.
Если передаваемая вами функция является одним выражением, вы можете использовать любое из них, и результат будет таким же. Однако, если функция включает несколько выражений, вы должны использовать фигурные скобки. По этой причине я всегда предпочитаю использовать фигурные скобки, кроме того, что я считаю, что это делает ваши намерения более ясными (Обратите внимание, что речь идет об одном выражении, а не об одной строке. Например:
lst map (x => findInDatabase(x)
.getOrElse(ERROR_VALUE))
было бы хорошо (так как findInDatabase(x).getOrElse(ERROR_VALUE)
это одно выражение, даже если оно разбито на несколько строк.
Кроме того, если функция в настоящее время является одним выражением, а затем вам нужно изменить его на несколько выражений, необходимо помнить, чтобы заменить скобки на фигурные скобки (еще одна вещь, которую нужно запомнить).
Вы можете использовать только фигурные скобки, когда функция принимает только один аргумент. Идея состоит в том, чтобы сделать вызов метода более похожим на управляющую абстракцию. Так что да, вы правы, это действительно вопрос стиля.