gpt4 book ai didi

scala - 为什么 Scala :_* to expand a Seq into variable-length argument list does not work in this case?

转载 作者:行者123 更新时间:2023-12-05 01:09:22 25 4
gpt4 key购买 nike

为什么使用 Scala :_*在这种情况下,将 Seq 扩展为可变长度参数列表不起作用?

以及如何优雅地解决它?

import java.sql.Connection
import scalikejdbc.ConnectionPool
import anorm.{SQL, SqlQuery, SqlRow, Row}

object AnormExample extends App {
Class.forName("org.hsqldb.jdbc.JDBCDriver")
ConnectionPool.singleton("jdbc:hsqldb:mem:hsqldb:WithAnorm", "", "")
implicit val conn: Connection = ConnectionPool.borrow()

// this works
SQL("insert into emp (id, name) values ({id}, {name})").onParams(3, "name3").executeUpdate()

// this does not compile
val row = Seq(4, "name4")
SQL("insert into emp (id, name) values ({id}, {name})").onParams(row:_*).executeUpdate() // david
}

错误:
scala: type mismatch;
found : Seq[Any]
required: Seq[anorm.ParameterValue[?]]
SQL("insert into emp (id, name) values ({id}, {name})").onParams(row:_*).executeUpdate() // david

附:
<dependency>
<groupId>play</groupId>
<artifactId>anorm_2.10</artifactId>
<version>2.1.1</version>
</dependency>

<dependency>
<groupId>com.github.seratch</groupId>
<artifactId>scalikejdbc_2.10</artifactId>
<version>1.5.1</version>
</dependency>

<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.2.9</version>
</dependency>

任何优雅的解决方案?

更新

根据 senia 的回答,这解决了问题:
def toParameterValueSet(seq: Seq[Any]) = seq.map(v => v: anorm.ParameterValue[_])
val row = Seq(5, "name5")
SQL("insert into emp (id, name) values ({id}, {name})").onParams(toParameterValue(row):_*).executeUpdate()

有没有办法消除声明/使用 toParameterValueSet 的需要?

(例如,告诉 Scala 在自动扩展 :_* 上使用隐式转换)

更新

更紧凑一点:
implicit def toParameterValueSet(seq: Seq[Any]): Seq[anorm.ParameterValue[_]] = seq.map(v => v: anorm.ParameterValue[_])
val row = Seq(5, "name5")
SQL("insert into emp (id, name) values ({id}, {name})").onParams(row:_*).executeUpdate()

@Typesafe 团队:你能在 acrom SQL 上添加一个参数来获取一系列值吗?
(而不是必须使用:_*)
(我同意使用命名参数是首选,但有时使用未命名参数仍然很有用)

最佳答案

你可以尝试更换

val row = Seq(4, "name4")


val row = Seq[anorm.ParameterValue[_]](4, "name4")

所有类型都有隐式转换,因此您可以使用 row.map{ e => e: anorm.ParameterValue[_] } 转换您的集合。

关于scala - 为什么 Scala :_* to expand a Seq into variable-length argument list does not work in this case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15904145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com