找不到懒惰的val

时间:2015-10-13 14:10:27

标签: scala implicit

为什么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并不会改变任何内容。

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

1 个答案:

答案 0 :(得分:3)

  

为什么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列表中写道,“一般来说,总是为隐式方法编写结果类型是一个好主意。也许语言应该需要它。”

         

一旦我将一个结果类型添加到一个隐含的内容中,我已经被自己的问题咬了几次,所以我想我会打开一张票。