0

我正在尝试将以下代码从一个类中提取到一个特征中以供重用:

import org.slf4j.{LoggerFactory, Logger}
import slick.driver.H2Driver.api._

import scala.concurrent.Await
import scala.concurrent.duration.Duration


object UserProfileFixtures {
  val logger: Logger = LoggerFactory.getLogger(UserProfileFixtures.getClass)

  val table = UserProfileQueries.query

  // todo: Create a trait for all this
  def createSchema(db: Database) = {

    logger.info("Creating schema for the UserProfiles table")
    Await.result(db.run((table.schema).create), Duration.Inf)
    logger.info("UserProfiles table schema created")
  }
}

问题是它table被隐式转换为添加schema属性的东西。如果我只是提升并转移上述内容,table则不会发生隐式转换,并且编译器找不到该schema属性。

我怎样才能找出我应该table在以下特征中给出什么类型?

import org.slf4j.Logger
import slick.driver.H2Driver.api._

import scala.concurrent.Await
import scala.concurrent.duration.Duration


trait FixtureHelper {

  val logger: Logger
  val data: Seq
  val table: TableQuery[_]     // this type is wrong...

  def createSchema(db: Database) = {

    logger.info("Creating schema")
    // compiler can't resolve `schema` in the line below
    Await.result(db.run(table.schema.create), Duration.Inf)
    logger.info("Schema created")
  }
}

我正在使用 slick 3.0 BTW,但这应该会有所作为。我想知道在隐式转换后如何找出值的类型。

4

1 回答 1

0

您可以使用结构类型来获取生成的隐式类:

scala> implicit class RchStr(s: String) { def v = 0 }
defined class RchStr

scala> implicitly[{def v: Int}]("aaa")
res5: AnyRef{def v: Int} = RchStr@3ab71d5e //"RchStr" is implicitly inferred type here

scala> implicitly[{def v: Any}]("aaa")
res6: AnyRef{def v: Any} = RchStr@2de743a3 // you may not know type of `v` - just specify `Any` then

scala> implicitly[{def z: Any}]("aaa") //there is no implicit conversions to something which has `z` member
<console>:9: error: type mismatch;
 found   : String("aaa")
 required: AnyRef{def z: Any}
              implicitly[{def z: Any}]("aaa")
                                       ^

在这里,我需要对任何带有 method 的东西进行一些隐式转换{def v: Int}。在您的特定情况下,它应该类似于:

println(implicitly[{def schema: Any}](table).getClass())

如果您需要找出的初始类型,table您可以使用table.getClass或检查 scaladoc 的隐式推断table类型以进行隐式转换。

IntelliJ IDEA 还显式地向您显示(Cntrl + 鼠标悬停)推断类型。您可能还需要检查一些推断类型的超类型。

也可能有帮助:Showing inferred types of Scala expressions , Inferred type in a Scala program

这将为您提供确切类型的类型标记,可以隐式转换为schema

import scala.reflect.runtime.universe._
def typeOf[T](x:T)( implicit tag: TypeTag[T], conversion: T => {def schema: Any} ) = tag
println(typeOf(table))
于 2015-03-29T11:11:29.827 回答