簡體   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