В Scala я предпочитаю писать большие цепочечные выражения множеству более мелких выражений с присваиваниями val
. В моей компании мы разработали стиль для этого типа кода. Вот полностью надуманный пример (идея состоит в том, чтобы показать выражение с большим количеством связанных вызовов):
import scala.util.Random
val table = (1 to 10) map { (Random.nextInt(100), _) } toMap
def foo: List[Int] =
(1 to 100)
.view
.map { _ + 3 }
.filter { _ > 10 }
.flatMap { table.get }
.take(3)
.toList
Руководство по стилю Scala Даниэля Спивака (pdf), которое мне в целом нравится, предлагает начальную точку в цепочке вызовы методов могут быть плохими (см. документ: Вызов метода / Функции высшего порядка), хотя он не распространяется настрочные выражения, подобные этому напрямую.
Есть ли другой, более приемлемый / идиоматический способ написать функцию foo
выше?
ОБНОВЛЕНИЕ: 28 июня 2011 г.
Множество замечательных ответов и обсуждений ниже. Похоже, что не существует 100% -ного ответа «вы должны сделать это так», поэтому я собираюсь принять самый популярный ответ по голосам, который в настоящее время является подходом для понимания. Лично я думаю, что пока буду придерживаться обозначения с точкой и принять риски, связанные с этим.
Мое правило: если выражение помещается на одной строке (80-120 символов), держите его на одной строке и по возможности пропускайте точки:
def foo: List[Int] =
(1 to 100).view map { _ + 3 } filter { _ > 10 } flatMap table.get take 3 toList
Как указал Кевин, точка - свободный стиль может улучшить краткость (но может повредить читабельности для разработчиков, не знакомых с ним):
def foo: List[Int] =
(1 to 100).view map{3+} filter{10<} flatMap table.get take 3 toList
Нотация ведущей точки вполне приемлема, если вам нужно разделить выражение на несколько строк из-за длины , Другая причина использования этой нотации - когда для операций нужны отдельные комментарии. Strike> Если вам нужно распределить выражение по нескольким строкам из-за его длины или необходимости комментировать отдельные операции, лучше всего обернуть все выражение в скобки (как Алекс Бойсверт предлагает . В этих ситуациях каждая (логическая) операция должна идти в отдельной строке (т. е. каждая операция идет в одной строке, за исключением случаев, когда несколько последовательных операций можно кратко описать одним комментарием). ):
def foo: List[Int] =
( (1 to 100).view
map { _ + 3 }
filter { _ > 10 }
flatMap table.get
take 3
toList )
Этот метод позволяет избежать потенциальных проблем с выводом точки с запятой , которые могут возникнуть при использовании обозначения начальной точки или при вызове метода 0-arg в конце выражения.