2013-07-10 56 views
2

比方说,我有一个函数斯卡拉开放写入到标准输出或文件

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一个好主意:

回答

4

如为什么不重写功能。这基本上就是它的原因。在很好的Scala代码中,您不会看到明确引用null

事实上,你的代码甚至不会为我编译。 Nil用于表示空列表,而不是空或不提供String

2

为了增强cmbaxter的回应......

有可能null值映射一个StringOption[String]很简单:Option(stringValue)将返回None其中stringValuenullSome(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 
        } 
        ... 
    } 
    
0

为了进一步增强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暗示,这可能是更地道斯卡拉。