【问题标题】:lazy implicit val not found未找到惰性隐式 val
【发布时间】:2015-10-13 14:10:26
【问题描述】:

为什么scala在这里找不到隐式?

class A

class Foo {
  lazy val x = implicitly[A]
  implicit lazy val a = new A
}

错误:找不到参数 e 的隐式值:A

但这很好用:

class Foo {
  lazy val x = implicitly[A]
  implicit lazy val a: A = new A // note explicit result type
}

定义类 Foo

FWIW 对于这个应用程序,我坚持使用 Scala 2.10。此外,将lazy val 替换为def 似乎没有任何改变。

在我的实际应用程序中,我有一个文件,其中包含为各种域对象定义的一堆隐式,其中一些是相互依赖的。尝试以一种确保所有依赖项都位于其各自依赖项之前的方式来安排它们似乎是一场噩梦,因此我将它们全部标记为lazy。必须显式声明每个 val 的类型会使代码变得混乱,而且似乎没有必要。有什么办法吗?

【问题讨论】:

  • Scala2.11 也会发生这种情况。正如你所说,正确的顺序确实有效implicit lazy val a = new A; lazy val x = implicitly[A]。这不应该是 Scala 中的一个错误吗?
  • 如果您将隐式调用移到隐式惰性 val 定义之后,则无需添加类型注释即可编译。

标签: scala implicit


【解决方案1】:

为什么scala在这里找不到隐式?

I have implemented a slightly more permissive rule: An implicit conversion without explicit result type is visible only in the text following its own definition. That way, we avoid the cyclic reference errors. I close for now, to see how this works. If we still have issues we migth come back to this.

必须显式声明每个 val 的类型会混淆代码,而且似乎没有必要。

对于隐式,我仍然建议这样做。这个问题不是唯一的原因。如果在未来无意中更改了隐式类型,这可能会以难以理解的方式破坏编译。另请参阅上面链接的问题:

Martin 在 scala-user 列表中写道,“一般来说,总是为隐式方法编写结果类型是个好主意。也许语言应该需要它。”

我已经被我自己添加了一个结果类型到隐式中后就消失了几次问题,所以我想我会为此开一张票。

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2021-10-17
    相关资源
    最近更新 更多