【问题标题】:Scala: "recursive value ... needs type" but I use Java types onlyScala:“递归值......需要类型”,但我只使用 Java 类型
【发布时间】:2016-01-26 11:48:55
【问题描述】:
object Rec extends App {
  val outStream = new java.io.ByteArrayOutputStream
  {
    val out = new java.io.PrintStream(new java.io.BufferedOutputStream(outStream))
  }
}

这个看似简单的代码导致编译错误:

$ scalac rec.scala
rec.scala:2: error: recursive value out needs type
  val outStream = new java.io.ByteArrayOutputStream
                  ^
one error found

但我看不出什么是“递归”。

Scala 编译器版本 2.11.7 -- 版权所有 2002-2013,LAMP/EPFL

背景:我正在尝试使用 Console.withOutprintln 上编写单元测试

【问题讨论】:

    标签: scala


    【解决方案1】:

    将大括号放在它们所属的位置后,代码如下所示:

    object Rec extends App {
      val outStream = new java.io.ByteArrayOutputStream {
        val out = new java.io.PrintStream(new java.io.BufferedOutputStream(outStream))
      }
    }
    

    这就是你如何创建一个匿名类的对象,它的成员 out 递归地使用定义的对象(outStream 在其定义中使用 outStream)。

    我相信这就是你想要做的

    object Rec extends App {
      val outStream = new java.io.ByteArrayOutputStream
      val out = new java.io.PrintStream(new java.io.BufferedOutputStream(outStream))
    }
    

    如果你因为某些原因需要创建另一个作用域,你可以使用locally

    What does Predef.locally do, and how is it different from Predef.identity

    【讨论】:

    • 感谢您告诉我locally
    【解决方案2】:

    您通过调用您传递给outStream 的东西来为outStream 分配一个值(我用大写字母标记了它)。因此递归。

    object Rec extends App {
      val OUTSTREAM = new java.io.ByteArrayOutputStream
      {
        val out = new java.io.PrintStream(new java.io.BufferedOutputStream(OUTSTREAM))
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      相关资源
      最近更新 更多