web-dev-qa-db-ja.com

<>演算子はSlickで何をしますか?

Slickのドキュメント を歩いて、迅速に動作するプロトタイプをセットアップしました。

マップされたテーブルのセクションで、前述の例に<>演算子が表示されていますが、そのドキュメントはどこにも見つかりません。これを理解するのに助けが必要です。

21

<>演算子は、RowTablecase classの間の関係を定義します。

case class User(id: Option[Int], first: String, last: String)

ROW            |id             | first        | last        |

したがって、データは最初にn-Tuple<>の左側)として表から取り出され、次にcase class<>の右側)に変換されます。

ケースクラスの変換を機能させるには、次の2種類のメソッドが必要です。

Rowからn-Tupleからcase class

scala> User.tupled
res6: ((Option[Int], String, String)) => User = <function1>

したがって、この関数は、引数としてトリプル(Option[Int], String, String)を指定すると、Userを作成できます。

case classからn-TupleはDBに書き込まれます。

scala> User.unapply _
res7: User => Option[(Option[Int], String, String)] = <function1>

この関数は、逆の機能を提供します。ユーザーが与えられると、トリプルを抽出できます。このパターンはExtractorと呼ばれます。ここでこれについてもっと学ぶことができます: http://www.scala-lang.org/old/node/112

23
Andreas Neumann

これはscala演算子ではなく、slickの ShapedValue クラスによって定義されたメソッドです。

リンクしたドキュメントでわかるように、2つのメソッドを提供するケースクラスとの間でプロジェクションをマッピングするために使用されます

 def * = (id.?, first, last) <> (User.tupled, User.unapply)

Slickソースリポジトリのクローンを作成 およびgrep for def <>、あなたはそれを見つけるでしょう<>ShapedValue のメソッドであり、 MappedProjection を返します。

2
Chris Martin