Pour l'expliquer, nous devons d'abord expliquer les classes imbriquées en Scala. Considérons cet exemple simple :
class A {
class B
def f(b: B) = println("Got my B!")
}
Maintenant, essayons quelque chose avec ça :
scala> val a1 = new A
a1: A = A@2fa8ecf4
scala> val a2 = new A
a2: A = A@4bed4c8
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
Lorsque vous déclarez une classe à l'intérieur d'une autre classe en Scala, vous dites que chaque cas de cette classe a une telle sous-classe. En d'autres termes, il n'y a pas de A.B
mais il y a a1.B
y a2.B
et ils sont différents comme l'indique le message d'erreur ci-dessus.
Si vous n'avez pas compris cela, consultez les types dépendants du chemin.
Maintenant, #
vous permet de faire référence à ces classes imbriquées sans vous limiter à une instance particulière. En d'autres termes, il n'y a pas de A.B
mais il y a A#B
ce qui signifie qu'un B
classe imbriquée de tout exemple de A
.
Nous pouvons voir cela en action en modifiant le code ci-dessus :
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
Et l'essayer :
scala> val a1 = new A
a1: A = A@1497b7b1
scala> val a2 = new A
a2: A = A@2607c28c
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
scala> a2.g(new a1.B)
Got a B.
1 votes
Le "signe dièse" est parfois appelé "octathrop" (cette recherche google m'a amené à cette page).
3 votes
Faites que octothorpe ou octothorp
0 votes
Qu'en est-il des autres opérateurs comme #+ et #- (voir github.com/tpolecat/doobie/blob/series/0.4.x/yax/h2/src/main/ ) ? Existe-t-il une liste exhaustive ?