2

我有一个非常令人费解的问题。我正在玩squeryl,并在我使用时发现:

package models

import org.squeryl.{Schema, KeyedEntity}

object db extends Schema {
  val userTable = table[User]("User")

  on(userTable)(b => declare(
      b.email is(unique,indexed("idxEmailAddresses"))
      ))
}

我不得不进口import org.squeryl.PrimitiveTypeMode._

但这对我来说没有意义。这里is是在 org.squeryl.dsl.NonNumericalExpression 中定义的,但为什么我必须包含看似无关的import org.squeryl.PrimitiveTypeMode._

谢谢你。

4

1 回答 1

2

我同意@sschaef 的观点,这是由于所需的隐式转换。当 API(如 squeryl)决定构建一种 DSL(领域特定语言)以获得针对其 API 进行编码的巧妙方式时,将需要隐式转换。核心 API 可能采用某些类型的对象,直接在代码中实例化这些对象可能很麻烦/难看。因此,他们将使用隐式转换为您完成一些工作,并尽可能保持 DSL 干净。如果您查看 ScaladocPrimitiveTypeMode对象,您可以看到其上定义的许多隐式定义。隐式转换(用于拉皮条库)将从一种类型“向上转换”为另一种类型,以获得对拉皮条类的更多功能的访问。当代码是隐含的东西时,会显式地包含在最终编译的代码中。

http://squeryl.org/api/index.html#org.squeryl.PrimitiveTypeMode $

另外,我相信您正在寻找的隐式转换是:

导入 org.squeryl.PrimitiveTypeMode.string2ScalarString

它继承自 org.squeryl.dsl.QueryDsl。

于 2013-04-26T18:41:41.447 回答