加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么需要一个return语句才能正确评估while语句?

发布时间:2020-12-16 18:24:04 所属栏目:安全 来源:网络整理
导读:为什么需要一个return语句来允许这个while语句 评估得当吗?以下声明允许 import java.io.Fileimport java.io.FileInputStreamimport java.io.InputStreamimport java.io.BufferedReaderimport java.io.InputStreamReadertrait Closeable { def close ()}tra
为什么需要一个return语句来允许这个while语句
评估得当吗?以下声明允许

import java.io.File
import java.io.FileInputStream
import java.io.InputStream
import java.io.BufferedReader
import java.io.InputStreamReader

trait Closeable {
  def close ()
}

trait ManagedCloseable extends Closeable {
  def use (code: () => Unit) {
    try {
      code()
    }
    finally {
      this.close()
    }
  }
}

class CloseableInputStream (stream: InputStream)
extends InputStream with ManagedCloseable {
  def read = stream.read
}

object autoclose extends App {
  implicit def inputStreamToClosable (stream: InputStream):
    CloseableInputStream = new CloseableInputStream(stream)

  override
  def main (args: Array[String]) {
    val test = new FileInputStream(new File("test.txt"))

    test use {
      val reader = new BufferedReader(new InputStreamReader(test))

      var input: String = reader.readLine

      while (input != null) {
        println(input)
        input = reader.readLine
      }
    }
  }
}

这会从scalac产生以下错误:

autoclose.scala:40: error: type mismatch;
 found   : Unit
 required: () => Unit
      while (input != null) {
      ^
one error found

似乎它试图在使用后将块视为一个
内联语句而不是lambda,但我不确定为什么.添加
在while之后返回缓解错误:

test use {
  val reader = new BufferedReader(new InputStreamReader(test))

  var input: String = reader.readLine

  while (input != null) {
    println(input)
    input = reader.readLine
  }

  return
}

应用程序按预期运行.任何人都可以向我描述发生了什么
在那里呢?这好像应该是一个bug.它已经
虽然在许多版本的Scala中持久存在(测试2.8.0,2.9.0,2.9.1)

解决方法

那是因为它的用法被声明为()=>单位,因此编译器期望您使用的块返回满足此签名的内容.

似乎你想要的是将整个块转换为一个名字参数,这样做改变def使用(代码:()=>单位)到def使用(代码:=>单位).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读