Я спробував одного разу написати про це, але врешті-решт я відмовився, оскільки правила дещо розсіяні. В основному, вам доведеться розвісити це.
Можливо, найкраще зосередитись на тому, де фігурні дужки та круглі дужки можуть бути взаємозамінними: під час передачі параметрів викликам методів. Ви можете замінити круглі дужки фігурними дужками, якщо і лише тоді, якщо метод очікує єдиного параметра. Наприклад:
List(1, 2, 3).reduceLeft{_ + _} // valid, single Function2[Int,Int] parameter
List{1, 2, 3}.reduceLeft(_ + _) // invalid, A* vararg parameter
Однак вам потрібно знати більше, щоб краще зрозуміти ці правила.
Збільшена перевірка компіляції з використанням паролів
Автори Spray рекомендують круглі парени, оскільки вони надають підвищену перевірку компіляції. Це особливо важливо для таких DSL, як Spray. Використовуючи пароні, ви говорите компілятору, що йому слід надати лише один рядок; тому, якщо ви випадково дасте йому два і більше, він скаржиться. Зараз це не так з фігурними дужками - якщо, наприклад, ви десь забули оператора, ваш код скомпілюватиметься, і ви отримаєте несподівані результати та, можливо, дуже важку помилку. Нижче надумано (оскільки вирази чисті і, принаймні, будуть попереджати), але зазначає:
method {
1 +
2
3
}
method(
1 +
2
3
)
Перший складає, другий дає error: ')' expected but integer literal found
. Автор хотів писати 1 + 2 + 3
.
Можна стверджувати, що це подібне для багатопараметричних методів із аргументами за замовчуванням; неможливо випадково забути кому для розділення параметрів під час використання паронів.
Багатослівність
Важлива часто забуваюча примітка про багатослів’я. Використання фігурних брекетів неминуче призводить до багатослівного коду, оскільки керівництво по стилю Scala чітко зазначає, що закриття фігурних дужок повинно бути власним рядком:
… Фіксуюча дужка знаходиться на власній лінії відразу після останнього рядка функції.
Багато автопереформаторів, як в IntelliJ, автоматично виконають це переформатування для вас. Тому спробуйте дотримуватися використання круглих парен, коли зможете.
Помітка інфіксації
Використовуючи позначення infix, List(1,2,3) indexOf (2)
ви можете опустити дужки, якщо є лише один параметр, і записати його як List(1, 2, 3) indexOf 2
. Це не стосується точкового позначення.
Зауважте також, що коли у вас є один параметр, який є багатотоковим виразом, наприклад, x + 2
або a => a % 2 == 0
, вам потрібно використовувати дужки для позначення меж виразу.
Кортежі
Оскільки ви можете опускати дужки іноді, іноді кортеж потребує додаткових дужок, як у ((1, 2))
, а іноді зовнішні дужки можуть бути опущені, як у (1, 2)
. Це може спричинити плутанину.
Функція / Часткова література функції з case
Scala має синтаксис функціональних та часткових функціональних літералів. Це виглядає приблизно так:
{
case pattern if guard => statements
case pattern => statements
}
Єдині інші місця, де можна використовувати case
оператори, - це ключові слова match
та catch
:
object match {
case pattern if guard => statements
case pattern => statements
}
try {
block
} catch {
case pattern if guard => statements
case pattern => statements
} finally {
block
}
Ви не можете використовувати case
оператори в будь-якому іншому контексті . Отже, якщо ви хочете використовувати case
, вам потрібно фігурні брекети. Якщо вам цікаво, що робить різницю між функцією та частковою функцією буквальною, відповідь: контекст. Якщо Scala очікує функцію, ви отримаєте функцію. Якщо він очікує часткової функції, ви отримуєте часткову функцію. Якщо очікують обох, це дає помилку щодо неоднозначності.
Вирази та блоки
Парентез можна використовувати для виготовлення підвиражень. Фігурні дужки можна використовувати для виготовлення блоків коду (це не буквальна функція, тому будьте обережні, намагаючись використовувати її як один). Блок коду складається з декількох висловлювань, кожен з яких може бути заявою про імпорт, декларацією або виразом. Виходить так:
{
import stuff._
statement ; // ; optional at the end of the line
statement ; statement // not optional here
var x = 0 // declaration
while (x < 10) { x += 1 } // stuff
(x % 5) + 1 // expression
}
( expression )
Отже, якщо вам потрібні декларації, кілька заяв, import
або щось подібне, вам потрібні фігурні дужки. А оскільки вираз є твердженням, круглі дужки можуть з’являтися всередині фігурних дужок. Але найцікавіше, що блоки коду - це також вирази, тому ви можете використовувати їх будь-де всередині виразу:
( { var x = 0; while (x < 10) { x += 1}; x } % 5) + 1
Отже, оскільки вирази - це висловлювання, а блоки кодів - це вирази, все нижче:
1 // literal
(1) // expression
{1} // block of code
({1}) // expression with a block of code
{(1)} // block of code with an expression
({(1)}) // you get the drift...
Там, де вони не взаємозамінні
В принципі, ви не можете замінити {}
з ()
або навпаки де - небудь ще. Наприклад:
while (x < 10) { x += 1 }
Це не виклик методу, тому ви не можете записати його іншим способом. Ну, ви можете помістити фігурні дужки всередині дужок для condition
, а також використовувати дужки всередині фігурних дужок для блоку коду:
while ({x < 10}) { (x += 1) }
Тож, сподіваюся, це допомагає.