当用作隐式方法参数值时,隐式值也可以是一个惰性值吗?

Ale*_*dar 4 scala

我有一个测试套件,它使用Slick进行数据库访问.此套件中的某些测试访问数据库而某些测试不访问.我的套房有

implicit val db = DB.getDB

DataBaseDef在套件执行开始时有效地初始化.然后,此值将用作某些方法的隐式参数值.它还具有在套件执行结束时afterAll()关闭的功能db:

override def afterAll():Unit={
    db.close()
    super.afterAll()
  }
Run Code Online (Sandbox Code Playgroud)

现在,如果我改为: implicit lazy val db = DB.getDB 那究竟会发生什么?

如果我只运行一个不使用DB的测试,那么连接将不会被初始化,并且afterAll()它仍会尝试关闭连接,在这种情况下我有问题,对吧?我试图运行,但没有发生错误,没有抛出异常......

我对implicits的了解不足以帮助我理解它与懒惰相结合.

Yuv*_*kov 7

那究竟会发生什么?

在第一次访问该值之前,不会初始化该值.

它仍然会尝试关闭连接,在这种情况下我有问题,对吗?

当您访问时db.close(),它将首先初始化该值,这意味着它将DB.getDb在关闭连接之前调用.这意味着,虽然您不打算这样做,但连接仍然会被初始化然后立即关闭,因此您不会看到异常.