我有一个很困惑的问题。我正在玩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._
?
谢谢。
最佳答案
我同意 @sschaef 的观点,这是由于需要隐式转换造成的。当 API(如 squeryl)决定构建 DSL(领域特定语言)以便获得一种针对其 API 进行编码的漂亮方式时,将需要隐式转换。核心 API 可能采用某些类型的对象,直接在代码中实例化这些对象可能会很麻烦/丑陋。因此,他们将使用隐式转换来为您完成一些提升工作,并尽可能保持 DSL 的干净。如果您查看 PrimitiveTypeMode
对象的 Scaladoc,您可以看到其上定义的许多隐式定义。隐式转换(在拉皮条库中使用)将从一种类型“上转换”为另一种类型,以获得对拉皮条类的更多功能的访问权限。当代码是隐式的时,事情会显式地包含到最终编译的代码中。
http://squeryl.org/api/index.html#org.squeryl.PrimitiveTypeMode $
此外,我相信您正在寻找的隐式转换是:
导入org.squeryl.PrimitiveTypeMode.string2ScalarString
继承自org.squeryl.dsl.QueryDsl。
关于scala - 如何理解以下 scala 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16242789/