gpt4 book ai didi

scala - 隐式参数未传递给闭包

转载 作者:行者123 更新时间:2023-12-04 17:59:57 26 4
gpt4 key购买 nike

我写了一个小事务助手,它通过一个闭包并在一个事务中执行它:

object Transaction {

val emf = Persistence.createEntityManagerFactory("defaultPersistenceUnit")

def execute(action: EntityManager => Unit) {
val em = emf.createEntityManager()
em.getTransaction.begin()
action(em)
em.getTransaction.commit()
em.close()
}
}

然后我有一个像这样的 ItemRepository:

object ItemRepository {
def add(implicit entityManager: EntityManager, item: Item) {
entityManager.persist(item)
}
}

最后我想使用隐式传递的 EntityManager 执行存储库方法:

Transaction.execute(implicit em => ItemRepository.add(item))

但是编译器告诉我:

not enough arguments for method add: (implicit entityManager: javax.persistence.EntityManager, implicit item: models.Item)Unit. Unspecified value parameter item.

如果我显式传递参数,一切正常:

Transaction.execute(em => ItemRepository.add(em, item))

这是怎么回事?它看起来与这个 answer 几乎一样.

最佳答案

隐式修饰符适用于整个参数列表,而不仅仅是一个参数。所以如果你希望 entitiyManager 参数是隐式的并且 item 参数不是隐式的,你必须这样写:

object ItemRepository {
def add(item: Item)(implicit entityManager: EntityManager) {
entityManager.persist(item)
}
}

否则编译器会假定您要显式传递整个参数列表,然后提示参数太少。

关于scala - 隐式参数未传递给闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14277992/

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