繁体   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