传递参数时匹配varargs的基数

时间:2015-11-04 14:59:26

标签: scala function parameters

一个接受File的简单函数和一个将为该文件传递PrintWriter的函数:

def printToFile(f: java.io.File)(op: java.io.PrintWriter => Unit) {
  val p = new java.io.PrintWriter(f)
  try { op(p) } finally { p.close() }
}

如何将此概括为任意数量的File,同时将生成的PrintWriter传递给一个函数?我想决定在客户端函数中使用哪个PrintWriter

我想要一个类似于(psuedocode)的签名:

def printToFile(f: java.io.File*)(op: (java.io.PrintWriter*) => Unit)

以下是我要编写客户端函数的方法:

printToFile(new File("file1.txt"), new File("file2.txt"), new File("file3.txt")) { 
    (file1PrintWriter, file2PrintWriter, file3PrintWriter) =>
        // do stuff, decide which PrintWriter to write to
}

两种* ed类型的基数相同。

重要的是,我希望客户端功能能​​够声明收到的PrintWriter变量,而不仅仅是Seq[PrintWriter]或类似的处理。

1 个答案:

答案 0 :(得分:0)

我看起来你需要创建与参数数量一样多的PrintWriter个实例。以下应该有效。

import java.io._

object Foo {
  def printToFile(files: File*)(op: (PrintWriter*) => Unit) {
    val printers: Seq[PrintWriter] = files.map(file => new PrintWriter(file))

    try {
      op(printers :_*)
    } finally {
      printers.foreach(_.close)
    }
  }
}