Сначала нам нужно различать xss.map(f)
и xss map f
. Согласно документации Scala, любой метод, который принимает один параметр, может использоваться как инфиксный оператор.
На самом деле метод map
в List
является одним из этих методов. . Игнорируя полную подпись и тот факт, что она унаследована от TraversableLike
, подпись выглядит следующим образом:
final def map[B](f: (A) ⇒ B): List[B]
Таким образом, он принимает один параметр, а именно f
, который является функцией с типом A => B
. Итак, если у вас есть значение функции, определенное как
val mySize = (xs:List[Int]) => xs.size
вы можете выбрать между
xss.map(mySize)
or
xss map mySize
Это вопрос предпочтений, но согласно Руководству по стилю Scala, в данном случае предпочтительнее последнее, если только оно не является частью сложного выражения, где лучше придерживаться записи через точку.
Обратите внимание, что если вы решите использовать точечную нотацию, вам всегда нужно квалифицировать приложение функции с помощью квадратных скобок! Вот почему ни один из следующих вариантов не компилируется успешно.
xss.map xs => x :: xs // Won't compile
xss.map x :: _ // Won't compile
xss.map _ x :: _ // Won't compile
Но в большинстве случаев вместо передачи значения функции вам нужно передать литерал функции (она же анонимная функция). В этом случае снова, если вы используете точечную нотацию, вам нужно что-то вроде xss.map(_.size)
. Но если вы используете инфиксную нотацию, это будет вопросом приоритета.
Например
xss map x :: _ // Won't compile!
не работает из-за приоритета оператора. Поэтому вам нужно использовать скобки, чтобы устранить неоднозначность ситуации для компилятора с помощью xss map (x :: _)
.
Использование фигурных скобок вместо скобок имеет очень ясное и простое правило. Опять же, любая функция, которая принимает только один параметр, может быть применена с фигурными скобками вместо скобок, как для инфиксной, так и для точечной нотации. Таким образом, следующие операторы будут скомпилированы.
xss.map{x :: _}
xss map {x :: _}
Чтобы избежать путаницы, вы можете начать с записи через точку и явных типов для параметров. Позже, после компиляции и, возможно, написания некоторых модульных тестов для вашего кода, вы можете начать рефакторинг кода, удалив ненужные типы, используя инфиксную нотацию и фигурные скобки вместо скобок, где это имеет смысл.
Для этого вы можете обратиться к Руководству по стилю Scala и выступление Мартина Одерски на Scala Days 2013, посвященное стилю кодирования Scala. Также вы всегда можете обратиться за помощью к IDE для рефакторинга кода, чтобы сделать его более кратким.
person
Nader Ghanbari
schedule
19.10.2014