簡體   English   中英

Scala打開寫入標准輸出或文件

[英]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)stringValuenull將返回None ,在非null時將返回Some(stringValue)

因此,您可以:

  1. writeToFileOrStdout(Option(stringValue)) ,或

  2. 如果您將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM