anormの「caseid〜username=> _」を理解するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/9389757

  •  29-10-2019
  •  | 
  •  

質問

Play2のアノームには、結果パーサーの優れたDSLがあります: ジェネラコディセタグプレ

この部分のcase id ~ nameがわかりません。なぜ、2つの変数の間に~が存在する可能性があるのですか?

通常、caseは次のように表示されます: ジェネラコディセタグプレ

しかし、case id ~ nameが表示されません。

~のソースは次のとおりです: https://github.com/playframework/Play20/blob/master/framework/src/anorm/src/main/scala/SqlParser.scala#L49

ケースクラス~を定義します: ジェネラコディセタグプレ

そして私は簡単なテストを書きます: ジェネラコディセタグプレ

a,bを出力しますが、構文がcase x ~ yであるのはなぜですか?

役に立ちましたか?

解決

あなたはすでにそこにいます。Scalaでは、 2つの型パラメータで宣言されているすべてのタイプに対してそれをすることができます。

例えば:

scala> case class Foo[X,Y]()
defined class Foo

scala> val x: Int Foo Double = Foo[Int,Double]()
x: Foo[Int,Double] = Foo()
.

最初は奇妙に思えるかもしれませんが、この構文は物事をより読みやすくすることができるので、実際には本当に素晴らしい財産です。タプルのカスタムタイプが定義されている次の例を考えてください。

class |::|[A, B](val left: A, val right: B)

object |::| {
  def unapply[A, B](o: A |::| B) = Some((o.left, o.right))
}
.

ここでは、A |::| B|::|[A, B]のIFIX表記として使用されています。一方、Scala では、次の例のコンストラクタの場合のように、パターンマッチングのためのIFIX表記(リマインダにはINCROPのおかげで)を使用できます。

new |::|("Hello","World") match {
  case l |::| r => Console println (l + "," + r)
  case _ =>
}  
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top