找不到懒惰的val

Dyl*_*lan 7 scala implicit

为什么scala不能在这里找到隐含的?

class A

class Foo {
  lazy val x = implicitly[A]
  implicit lazy val a = new A
}
Run Code Online (Sandbox Code Playgroud)

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

但这很好用:

class Foo {
  lazy val x = implicitly[A]
  implicit lazy val a: A = new A // note explicit result type
}
Run Code Online (Sandbox Code Playgroud)

定义了类Foo

FWIW我在这个应用程序上遇到了Scala 2.10.此外,更换lazy valdef似乎并没有改变任何东西.

在我的实际应用程序中,我有一个文件,其中包含为各种域对象定义的一系列implicits,其中一些依赖于彼此.尝试以一种确保所有依赖关系都出现在各自家属之前的方式来安排它们似乎是一场噩梦,因此我将它们全部标记为lazy.必须明确声明每个val的类型混淆代码,似乎应该是不必要的.有什么方法吗?

Ale*_*nov 3

为什么 scala 不能在这里找到隐含的内容?

我实现了一个稍微宽松的规则:没有显式结果类型的隐式转换仅在遵循其自己定义的文本中可见。这样,我们就可以避免循环引用错误。我现在关闭,看看这是如何工作的。如果我们仍然有问题,我们可能会回到这个问题。

必须显式声明每个值的类型会使代码变得混乱,而且似乎没有必要。

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

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

我已经被问题困扰过几次,一旦我将结果类型添加到隐式中,这些问题就消失了,所以我想我应该就此开一张票。