2

関数があるとしましょう

writeToFileOrStdout(fname: String = Nil) = { ... }

ユーザーが fname に文字列値を渡す場合、その名前のファイルを開いて書き込みたいと思います。それ以外の場合は、stdout に出力したいと思います。if ステートメントを書くだけでこれを処理できますが、fname に case ステートメントを記述して、対応する正しい outputStream を開くにはどうすればよいでしょうか?

    val outStream = fname match {
      case Nil => ???
      case _   => new java.io.FileOutputStream(new java.io.File(fname))
    }
    outStream.write( ... )

ありがとう!

4

3 に答える 3

4

関数を次のように書き換えてみませんか。

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

実際、あなたのコードは私のためにコンパイルさえしません。 Nilnull または提供されていない ではなく、空のリストを表すために使用されStringます。

于 2013-07-10T17:28:23.840 に答える
2

cmbaxter のレスポンスを強化するには...

String可能なnull値を持つ a のマッピングOption[String]は自明です: where isとwhere non-nullOption(stringValue)を返します。NonestringValuenullSome(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
      }
      ...
    }
    
于 2013-07-10T18:43:53.133 に答える