タグのアイデアは、しばしばraw Long
、Int
などをどこからでも使用したくないということです。あなたのコードでそれらを使用したいのですが、それらを渡したくありません
def fetchUsers(numberOfUsers: Int, offset: Int): Seq[User]
ここでは、引数の順序を入れ替えていないことを確認するために、名前付きパラメータを使用する必要があります。さらに、間違った順序で間違っていると誤解するかもしれません。
override def fetchUsers(offset: Int, numberOfUsers: Int): Seq[User]
両方の引数に異なるタイプを使用できないようにするには、次のようにします。 1つの方法は、それはAnyVal
でケースクラスを使用することです - あなたがいくつかのルールに従っている場合、それはコンパイラによってプリミティブに最適化されています。タグは、いくつかの一般的な型(必ずしもプリミティブではないかもしれない)のために新しい型を導入する代わりの方法です。 @@
は、あなたが気付いたように、
type @@[A, T] = A
と定義されています。だからあなたは、新しいタイプを定義することができます。
@@[String, QueueURL.Marker]
が、Scalaは私たちがタイプに中置構文を使用できるようにするためとして、私たちもそれを書くことができます:あなたは依存性の注入を行う場合には特に便利です
String @@ QueueURL.Marker
例えばMacwire - 引数は型だけに基づいて取得されるため、注入可能な値ごとに区別される型を持つ必要があります(Macwireは独自のバージョンの@@
を実装しています。同じ目的)。
aws-scalaコードを見ると、最初のプロパティを実現したいと思っています。一般的なタイプ(たとえばString
)の異なる用途を区別し、コンパイラを使って間違いがないかどうかを確認できます。
'https:// github.com/scalaz/scalaz'には言及していないようです。 –
[ここ](https://github.com/scalaz/scalaz/blob/series/7.3.x/core/src/main/scala/scalaz/Tag.scala#L99)で定義されています。 –