Scala 3使用Using读取文件报错,求正确实现方案
问题解决:Scala 3中Using处理文件IO的正确方式
错误原因
你的代码报错是因为Using的设计目标是管理需要手动释放的资源(比如文件流、Source实例),它要求传入的参数必须有对应的Releasable类型实例(用于自动释放资源)。而你直接把Source.fromFile(...).getLines.mkString的结果(一个String)传给了Using,String不需要释放资源,编译器找不到对应的Releasable[String]实例,因此抛出错误。
正确实现方式
你需要把Source实例本身传给Using,让Using负责资源的创建和自动关闭,在资源可用的代码块内完成文件读取和翻译操作。这里有两种简洁的写法:
写法1:使用flatten处理嵌套Try
import scala.io.Source import scala.util.{Try, Using} def translateFromFile(filepath: String): Try[Thing] = Using(Source.fromFile(filepath)) { source => // 在Using的代码块内读取文件内容并调用translate val fileContent = source.getLines().mkString translate(fileContent) }.flatten // 把Try[Try[Thing]]扁平化为Try[Thing]
写法2:使用for推导式(更易读)
import scala.io.Source import scala.util.{Try, Using} def translateFromFile(filepath: String): Try[Thing] = for { // 利用Using获取并管理Source资源 source <- Using(Source.fromFile(filepath)) // 读取文件内容 content = source.getLines().mkString // 调用translate并获取结果 result <- translate(content) } yield result
关键说明
Using的核心作用是自动释放资源,因此必须传入资源本身(如Source、InputStream),而非资源读取后的普通数据(如String)。- 由于
translate返回Try[Thing],Using的代码块会返回Try[Thing],因此Using整体返回Try[Try[Thing]],需要用flatten或for推导式的绑定来扁平化结果,最终得到Try[Thing]。
内容的提问来源于stack exchange,提问作者ZhaoNan
相关产品推荐
相关产品推荐

