私は一度これについて書こうとしましたが、ルールがやや拡散しているので結局あきらめました。基本的には、コツをつかむ必要があります。
おそらく、中括弧と括弧が同じ意味で使用できる場所に集中することをお勧めします。パラメーターをメソッド呼び出しに渡すときです。メソッドが単一のパラメーターを必要とする場合に限り、括弧を中括弧で置き換えることができます。例えば:
List(1, 2, 3).reduceLeft{_ + _} // valid, single Function2[Int,Int] parameter
List{1, 2, 3}.reduceLeft(_ + _) // invalid, A* vararg parameter
ただし、これらのルールをよりよく理解するために知っておく必要のあることがさらにあります。
括弧によるコンパイルチェックの増加
Sprayの作成者は、コンパイルチェックを強化するため、丸かっこをお勧めします。これは、スプレーのようなDSLにとって特に重要です。括弧を使用することで、コンパイラーに単一行のみを与えるように指示しています。したがって、誤って2つ以上与えると、文句を言います。中かっこはこれに当てはまりません。たとえば、どこかで演算子を忘れた場合、コードがコンパイルされ、予期しない結果と非常に難しいバグが見つかる可能性があります。以下は工夫されていますが(式は純粋であり、少なくとも警告を与えるため)、要点を述べます:
method {
1 +
2
3
}
method(
1 +
2
3
)
最初はコンパイル、2番目はを与えerror: ')' expected but integer literal found
ます。著者は書きたかった1 + 2 + 3
。
デフォルトの引数を持つマルチパラメータメソッドの場合も同様です。括弧を使用する場合、パラメーターを区切るために誤ってコンマを忘れることはありません。
冗長性
冗長性に関する重要な、見落とされがちなメモ。中括弧を使用すると、Scalaスタイルガイドで中括弧を閉じる必要があると明確に記述されているため、詳細なコードが必要になります。
…右中括弧は、関数の最後の行のすぐ後に続く独自の行にあります。
IntelliJのような多くの自動再フォーマッターは、この再フォーマットを自動的に実行します。可能な場合は丸括弧を使用するようにしてください。
中置記法
中置表記法を使用する場合、List(1,2,3) indexOf (2)
パラメーターが1つだけの場合は括弧を省略して、と書くことができます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) }
これが役に立てば幸いです。