繁体   English   中英

有人可以帮助我理解这段代码吗?

[英]Can someone help me understand this snippet of code?

从根本上说,我知道这段代码的作用,但我试图完全理解 withTempDir 中的逻辑。

private def withTempDir(input: File => Unit): Unit = {
  val tempFolder = Files.createTempDirectory("temporalOutput")
  tempFolder.toFile.deleteOnExit()
  input(tempFolder.resolve("output").toFile)
}

withTempDir {
  x => 
    println(x.getAbsoluteFile.toString)
}

input(tempFolder.resolve("output").toFile)真的需要吗? 它的目的是什么? 可能只是tempFolder.resolve("output").toFile吗?

input(tempFolder.resolve("output").toFile) 真的需要吗?

是的。

它的目的是什么?

基本上,一切。
稍后我会展开。

可以只是 tempFolder.resolve("output").toFile 吗?

不; 那根本不会做任何事情。


withTempDir的要点是为您提供某种“范围” ,您可以在其中访问临时文件夹,您可以根据需要使用该文件夹; 程序完成执行后,此类文件夹(及其所有内容)将被删除。

因此,如您所见,您可以像这样使用函数:


withTempDir { folder => 
  // Do whatever with folder here
  ???
}

所以, withTempDir的参数本身就是一个函数,逻辑; 在这种情况下以 lambda 的形式出现。 在临时文件夹创建并配置为删除后(顺便说一句,以一种非常原始的方式) ,在withTempDir的主体中,它调用传递给它的函数。


如果您对 lambda、函数和高阶函数感到困惑,我鼓励您选择任何Scala课程/教程/书籍,这是该语言的 101 知识。

在最后一行input

private def withTempDir(input: File => Unit): Unit = {
  val tempFolder = Files.createTempDirectory("temporalOutput")
  tempFolder.toFile.deleteOnExit()
  input(tempFolder.resolve("output").toFile)
}

代码

withTempDir {
  x => 
    println(x.getAbsoluteFile.toString)
}

是相同的

val tempFolder = Files.createTempDirectory("temporalOutput")
tempFolder.toFile.deleteOnExit()
println(tempFolder.resolve("output").toFile.getAbsoluteFile.toString)

在最后一行中,函数input即当前x => println(x.getAbsoluteFile.toString)被应用于xtempFolder.resolve("output").toFile

如果您在withTempDir的最后一行删除input ,即您刚刚

private def withTempDir(input: File => Unit): Unit = {
  val tempFolder = Files.createTempDirectory("temporalOutput")
  tempFolder.toFile.deleteOnExit()
  tempFolder.resolve("output").toFile
}

然后withTempDir根本不依赖于input ,所以它就像

private def withTempDir/*(input: File => Unit)*/: Unit = {
  val tempFolder = Files.createTempDirectory("temporalOutput")
  tempFolder.toFile.deleteOnExit()
  tempFolder.resolve("output").toFile
}

然后在

withTempDir {
  x => 
    println(x.getAbsoluteFile.toString)
}

withTempDir应用于x => println(x.getAbsoluteFile.toString)没有多大意义,它与withTempDir相同,即

val tempFolder = Files.createTempDirectory("temporalOutput")
tempFolder.toFile.deleteOnExit()
tempFolder.resolve("output").toFile

当您定义private def withTempDir(input: File => Unit): Unit时,这意味着您可以将withTempDir应用于不同的函数input: File => Unit

withTempDir是所谓的高阶函数,因为它接受另一个函数。

https://docs.scala-lang.org/tour/higher-order-functions.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM