我有以下一段代码我想制作DRYer:
def createAdmin(/* ... */): Future[Int] =
db.run {
{
(users returning users.map(_.id)) += Account(0, /* ... */)
} flatMap { id =>
admins += Admin(userId = id, /* ... */)
}
}
def createStandardUser(/* ... */): Future[Int] =
db.run {
{
(users returning users.map(_.id)) += Account(0, /* ... */)
} flatMap { id =>
standardUsers += StandardUser(userId = id, /* ... */)
}
}
Run Code Online (Sandbox Code Playgroud)
编译好.但如果我将两者合并到以下内容中:
def createUser(role: String)(/* ... */): Future[Int] =
db.run {
{
(users returning users.map(_.id)) += Account(0, /* ... */)
} flatMap { id =>
role match {
case "admin" =>
admins += Admin(userId = id, /* ... */)
case "standard" =>
standardUsers += StandardUser(userId = id, /* ... */)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下类型不匹配错误:
[error] found : Long => slick.dbio.DBIOAction[Int,slick.dbio.NoStream,Nothing]
[error] required: Long => slick.dbio.DBIOAction[Int,slick.dbio.NoStream,E2]
[error] } flatMap { id =>
[error] ^
[error] one error found
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄清楚为什么.有人可以为我照亮这个吗?
小智 6
编译器无法正确找出使用的效果类型.作为一种解决方法,您应该能够通过指定所使用的类型来提供一些帮助,例如在flatMap操作中,这将是
flatMap[Int, NoStream, Effect.Write] { id =>
Run Code Online (Sandbox Code Playgroud)
在你的情况下.