Slick 如何在元组上解析 <> 方法

How is the <> method resolved on a tuple by Slick

我看到了 Slick 的文档,发现它在 table 的定义中强制使用 def * 方法来获取映射投影。 所以这条线看起来像这样

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

Slick example here

我看到 <> 方法在 tuple 上调用 - 在本例中是 Tuple2。该方法定义在 Slick 代码中的 case class ShapedValue 上。如何找出执行查找的隐式方法?

这是我的进口商品:

import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import slick.driver.H2Driver.api._
import slick.lifted.ShapedValue
import slick.lifted.ProvenShape

所以我自己想出了一个办法。
对象 Shape 实现了三个特征,即 ConstColumnShapeImplicitsAbstractTableShapeImplicitsTupleShapeImplicits 。这三个特征处理 Slick 中有关 Shapes 的隐式转换。 TupleShapeImplicits 包含将 Tuple 转换为 TupleShape 所需的所有隐式转换方法。

现在在 (name, id.?, salary.?).<>(User.tupled,User.unapply) 行中,方法 <> 有一个隐式参数 Shape Shape class 因此属于隐式转换的范围。 TupleShapeImplicits 也进入范围。