Scala中如何在for循环外部访问内部变量并写入文件?
解决Scala中访问for循环内val并写入外部文件的问题
嘿,作为Scala新手遇到这个作用域问题太正常了!咱们先把核心问题说清楚:Scala里的val是块级作用域的——也就是说,你在for循环大括号里定义的currentTime、duration这些val,出了循环就拿不到了。要实现“把循环里的变量写到外部文件”的需求,关键是先把循环中产生的这些值收集起来,等循环跑完再统一写入文件。
结合你给出的代码示例,我给你整理了具体的修改方案:
1. 先定义个数据结构存循环数据
首先,咱们可以用一个case class把每次循环里需要记录的信息打包起来,这样管理起来更清晰:
case class ExecutionRecord(iteration: Int, startTime: Long, endTime: Long, duration: Long)
2. 循环里收集数据,循环外写文件
把原来的for循环改成能收集数据的形式(用map就很适合,符合Scala函数式的风格),等所有循环迭代完成后,再把收集到的数据写入文件:
def time[A](logFile: String, description: String)(job: => A): Unit = { var totalDuration: Long = 0 // 用map遍历1到3的迭代,收集每次的执行记录 val executionRecords = (1 to 3).map { i => val currentTime = System.currentTimeMillis val result = job // 执行你传入的任务 val finalTime = System.currentTimeMillis val duration = finalTime - currentTime totalDuration = if (totalDuration == 0) duration else totalDuration.min(duration) // 返回当前迭代的所有记录数据 ExecutionRecord(i, currentTime, finalTime, duration) } // 循环结束后,统一写入文件 import java.io.PrintWriter new PrintWriter(logFile) { write(s"任务描述: $description\n") write(s"本次执行最小时长: $totalDuration ms\n") write("------------------------\n") write("每次迭代详情:\n") executionRecords.foreach { record => write(s"第${record.iteration}次迭代:\n") write(s" 开始时间: ${record.startTime}\n") write(s" 结束时间: ${record.endTime}\n") write(s" 执行时长: ${record.duration} ms\n\n") } close() } }
额外小提示
如果你还想记录任务执行的结果result,只需要修改一下ExecutionRecord,把结果也加进去就行:
case class ExecutionRecord[A](iteration: Int, startTime: Long, endTime: Long, duration: Long, result: A)
然后在map里返回ExecutionRecord(i, currentTime, finalTime, duration, result),写入文件的时候就可以把result也打印出来啦。
这样一来,既解决了循环内val无法外部访问的问题,也能优雅地把所有需要的信息写入文件~
内容的提问来源于stack exchange,提问作者Disha Purohit
相关产品推荐
相关产品推荐

