[英]Scala opening write to stdout or file
假設我有一個功能
writeToFileOrStdout(fname: String = Nil) = { ... }
如果用戶為fname傳遞字符串值,那么我想打開一個具有該名稱的文件並寫入該文件; 否則,我想打印到標准輸出。 我總是可以寫一個if語句來解決這個問題,但是我將如何在fname上寫一個case語句並打開正確的對應outputStream?
val outStream = fname match {
case Nil => ???
case _ => new java.io.FileOutputStream(new java.io.File(fname))
}
outStream.write( ... )
謝謝!
為什么不將函數重寫為:
def writeToFileOrStdout(fname: Option[String] = None) = {
val outStream = fname match{
case Some(name) => new java.io.FileOutputStream(new java.io.File(name))
case None => System.out
}
...
}
最好將Option
用作可選輸入,而不是使用null
。 這基本上就是它的用途。 在良好的Scala代碼中,您將看不到對null
顯式引用。
實際上,您的代碼甚至沒有為我編譯。 Nil
用於表示一個空列表,而不是null或未提供的String
。
為了增強cmbaxter的響應...
將具有可能為null
值的String
映射到Option[String]
是很簡單的: Option(stringValue)
在stringValue
為null
將返回None
,在非null時將返回Some(stringValue)
。
因此,您可以:
writeToFileOrStdout(Option(stringValue))
,或
如果您將String
(可能為null
值)作為writeToFileOrStdout
的參數,則在內部使用Option(fname)
並匹配它返回的內容:
def writeToFileOrStdout(fname: String = null) = { val outStream = Option(fname) match{ case Some(name) => new java.io.FileOutputStream(new java.io.File(name)) case None => System.out } ... }
為了進一步增強cmbaxter的響應,您可以考慮編寫以下代碼:
def filenameToOutputStream(name: String) =
new java.io.FileOutputStream(new java.io.File(name))
def writeToFileOrStdout(fname: Option[String] = None) = {
val outStream = fname map filenameToOutputStream getOrElse System.out
...
}
正如“慣用Scala :您的選項不匹配”一文所暗示的那樣,這可能是更慣用的Scala。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.