J'ai essayé une fois d'écrire sur ce sujet, mais j'ai donné jusqu'à la fin, et que les règles sont quelque peu diffus. Fondamentalement, vous aurez à obtenir le blocage de celui-ci.
Il est peut être préférable de se concentrer sur l'endroit où accolades et la parenthèse peut être utilisé de façon interchangeable: lors du passage de paramètres aux appels de méthode. Vous pouvez remplacer les parenthèses avec des accolades si, et seulement si, la méthode attend un paramètre unique. Par exemple:
List(1, 2, 3).reduceLeft{_+_} // valid, single Function2[Int,Int] parameter
List{1, 2, 3}.reduceLeft(_+_) // invalid, A* vararg parameter
Cependant, il n'y a plus que vous devez savoir pour mieux comprendre ces règles.
La Notation Infixe
Lors de l'utilisation de la notation infixe, comme List(1,2,3) indexOf (2)
vous pouvez omettre les parenthèses s'il n'y a qu'un seul paramètre, et de l'écrire comme List(1, 2, 3) indexOf 2
. Ce n'est pas le cas de la dot notation.
Notez également que lorsque vous avez un seul paramètre qui est un multi-jeton d'expression, comme x + 2
ou a => a % 2 == 0
, vous devez utiliser des parenthèses pour indiquer les limites de l'expression.
Les Tuples
Parce que vous pouvez omettre les parenthèses, parfois un n-uplet a besoin de plus de parenthèses, comme dans l' ((1, 2))
, et parfois à l'extérieur des parenthèses peuvent être omises, comme en (1, 2)
. Cela peut causer de la confusion.
Fonction/Fonction Partielle littéraux
Scala a une syntaxe de la fonction et de la fonction partielle de littéraux. Il ressemble à ceci:
{
case pattern if guard => statements
case pattern => statements
}
Les seuls autres endroits où vous pouvez utiliser les instructions case sont à l' match
et catch
de mots clés:
object match {
case pattern if guard => statements
case pattern => statements
}
try {
block
} catch {
case pattern if guard => statements
case pattern => statements
} finally {
block
}
Vous ne pouvez pas utiliser les instructions case dans n'importe quel autre contexte. Donc, si vous souhaitez utiliser case
, vous avez besoin d'accolades. Dans le cas où vous vous demandez ce que fait la distinction entre une fonction et fonction partielle, littérale, la réponse est: le contexte. Si Scala s'attend à une fonction, une fonction que vous obtenez. Si elle s'attend à une fonction partielle, vous bénéficiez d'une fonction partielle. Si les deux sont attendus, il donne une erreur à propos de l'ambiguïté.
Les Expressions et les Blocs
Les parenthèses peuvent être utilisées pour faire des sous-expressions. Accolades peuvent être utilisés pour faire des blocs de code (c'est pas une fonction littérale, méfiez-vous donc de tenter de l'utiliser comme une). Un bloc de code se compose de plusieurs états, dont chacun peut être une instruction d'importation, une déclaration ou d'une expression. Il va comme ceci:
{
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 )
Donc, si vous avez besoin de déclarations, plusieurs états, un import
ou quelque chose comme ça, vous avez besoin d'accolades. Et parce qu'une expression est une instruction, les parenthèses peuvent apparaître à l'intérieur des accolades. Mais la chose intéressante est que les blocs de code sont également des expressions, de sorte que vous pouvez les utiliser n'importe où à l'intérieur d' une expression:
( { var x = 0; while (x < 10) { x += 1}; x } % 5) + 1
Donc, puisque les expressions sont des déclarations, et des blocs de codes sont des expressions, tout ci-dessous est valide:
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...
Où ils ne sont pas interchangeables
Fondamentalement, vous ne pouvez pas remplacer {}
avec ()
ou vice versa d'ailleurs. Par exemple:
while (x < 10) { x += 1 }
Ce n'est pas un appel de méthode, de sorte que vous ne pouvez pas l'écrire d'une autre façon. Eh bien, vous pouvez mettre des accolades à l'intérieur de la parenthèse pour l' condition
, ainsi que l'utilisation de parenthèses à l'intérieur des accolades pour le bloc de code:
while ({x < 10}) { (x += 1) }
Donc, je espère que cette aide.