我每天都在斯卡拉學習新東西。我正在採用的當前路線是從Java nio中提取功能,並使Scala實現完全脫離它們。我觀察過其他Scala專家是如何使用java.nio.files包的,以及FileVisitor接口如何遞歸地遍歷子目錄和文件的嵌套目錄結構。斯卡拉:特質擴展java.nio.file.FileVisitor
但是,我遇到了一個小問題。我不能完全使
意義上,我注意到了paulp維持在github上的實現,我不能understand.It是他的代碼,我將介紹在這裏,我的問題和擔憂:
import java.nio.file.{ FileVisitResult, SimpleFileVisitor }
trait PathVisitor extends FileVisitor[Path] {
def preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult
def postVisitDirectory(dir: Path, exc: IOException): FileVisitResult
def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult
def visitFileFailed(file: Path, exc: IOException): FileVisitResult
}
好吧,他從FileVisitor擴展到Java接口:首先,我不確定Scala特徵是否可以從java接口擴展。我在REPL中測試了這一點。顯然這是好的。 REPL輸出如下:
C:\ Users \ lulu \ Documents \ GitHub \ akkaexperiments> scala 歡迎來到Scala版本2.10.2(Java HotSpot™64位服務器VM,Java 1.7.0_71)。 輸入表達式來評估它們。 類型:help獲取更多信息。
scala> import java.nio.file。{FileVisitor}; 進口java.nio.file.FileVisitor
階>進口java.nio.file.Path 進口java.nio.file.Path
階>性狀PathVisitor延伸FileVisitor的[路徑] 定義性狀PathVisitor
斯卡拉>
有了這樣的方式,我現在看了一下源FileVisitor.java。這裏是:這是保羅耐人尋味的地方。下面的代碼後面的解釋。
public interface FileVisitor<T> {
FileVisitResult preVisitDirectory(T dir);
FileVisitResult preVisitDirectoryFailed(T dir, IOException exc);
FileVisitResult visitFile(T file, BasicFileAttributes attrs);
FileVisitResult visitFileFailed(T file, IOException exc);
FileVisitResult postVisitDirectory(T dir, IOException exc);
}
---------------------
paulp's code continues below:
object PathVisitor {
class Simple extends SimpleFileVisitor[Path] with PathVisitor { }
val Continue = FileVisitResult.CONTINUE
val SkipSiblings = FileVisitResult.SKIP_SIBLINGS
val SkipSubtree = FileVisitResult.SKIP_SUBTREE
val Terminate = FileVisitResult.TERMINATE
def apply(f: (Path, BasicFileAttributes) => FileVisitResult): PathVisitor = new Simple {
override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult = f(file, attrs)
}
}
------
For context and comparison purposes here is the code for SimpleFileVisitor:
public class SimpleFileVisitor<T> implements FileVisitor<T> {
protected SimpleFileVisitor() {
}
@Override
public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
throws IOException
{
Objects.requireNonNull(dir);
Objects.requireNonNull(attrs);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(T file, BasicFileAttributes attrs)
throws IOException
{
Objects.requireNonNull(file);
Objects.requireNonNull(attrs);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(T file, IOException exc)
throws IOException
{
Objects.requireNonNull(file);
throw exc;
}
@Override
public FileVisitResult postVisitDirectory(T dir, IOException exc)
throws IOException
{
Objects.requireNonNull(dir);
if (exc != null)
throw exc;
return FileVisitResult.CONTINUE;
}
}
這一切後,我提出以下意見: 類的簡單擴展SimpleFileVisitor,這是Java FileVisitor的接口的實現
此外,在特質PathVisitor paulp混合,其方法定義與Java FileVisitor界面中的完全相同。
這裏有什麼讓我感到困惑的是: 1)爲什麼他在擴展SimpleFileVisitor的同時也混入了PathVisitor特性? 2)我們是不是試圖問類SimpleVisitor契約和FileVisitor trait未實現方法,當它們是相同的方法嗎? 3)他包裝了Simple Class,一組val代表SimpleFileVisitor方法的返回類型和一個apply方法。好的,你認爲這種結構背後的想法是什麼?
我真的很想使用PaulP制定的結構,但這是令人困惑的。它可能需要一些清理。 請指教。
保羅這樣做是「正確的方式」,我希望我有時間來解釋爲什麼。 (有不止一個正確的方法,但這是其中之一。)我希望別人會!關鍵是要思考這些事情爲您面向Scala的API所做的工作。如果你自己想出來,請寫一個答案! – 2015-03-30 19:44:06
感謝您的洞察。我一定會報告我的發現。這是一個令人興奮的搜索 – user3825558 2015-03-30 19:51:25
我應該說 - 我是_assuming_這是正確的方式,因爲它如何適合一個我沒有的更大的圖片。 – 2015-03-30 20:07:30