【问题标题】:Scala opening write to stdout or fileScala打开写入标准输出或文件
【发布时间】:2013-07-10 16:41:16
【问题描述】:

假设我有一个函数

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( ... )

谢谢!

【问题讨论】:

    标签: java scala io stdout


    【解决方案1】:

    为什么不将函数重写为:

    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

    【讨论】:

      【解决方案2】:

      为了增强 cmbaxter 的响应...

      将带有可能的null 值的String 映射到Option[String] 很简单:Option(stringValue) 将返回None,其中stringValuenull,而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
          }
          ...
        }
        

      【讨论】:

        【解决方案3】:

        为了进一步增强 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
          ...
        }
        

        正如帖子 Idiomatic Scala: Your Options Do Not Match 所暗示的,这可能是更惯用的 Scala。

        【讨论】:

          猜你喜欢
          • 2017-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-07
          • 2011-04-09
          • 1970-01-01
          • 1970-01-01
          • 2013-03-18
          相关资源
          最近更新 更多