如何理解以下scala调用

时间:2013-04-26 18:17:34

标签: scala squeryl

我有一个非常令人费解的问题。我正在玩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._

谢谢。

1 个答案:

答案 0 :(得分:2)

我同意@sschaef这是由于需要隐式转换。当API(如squeryl)决定构建DSL(特定于域的语言)以便获得一种灵活的方式来对其API进行编码时,将需要隐式转换。核心API可能需要某些类型的对象,直接在代码中实例化可能会很麻烦/丑陋。因此,他们将使用隐式转换为您做一些提升并尽可能保持DSL清洁。如果您查看了PrimitiveTypeMode对象的Scaladoc,您可以看到在其上定义的许多隐式defs。隐式转换(在pimping库中使用)将从一种类型“上转换”到另一种类型,以获得对拉皮条类的更多功能的访问。当代码隐含的东西被明确地包含在最终编译的代码中时。

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

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

import org.squeryl.PrimitiveTypeMode.string2ScalarString

继承自org.squeryl.dsl.QueryDsl。