55

次のことを行う方法を理解しようとして、髪を引き裂いています。

def foo(msf: String, o: Any, os: Any*) = {
    println( String.format(msf, o :: List(os:_*)) )
}

oメソッドを anと an でos Seq別々に宣言しなければならないのには理由があります。基本的に、(タイプの) 単一のオブジェクト パラメーターで呼び出される format メソッドで終了しますList 。試行中:

def foo(msf: String, o: Any, os: Any*) = {
    println( String.format(msf, (o :: List(os:_*))).toArray )
}

タイプエラーが表示されます:

見つかった: 配列[任意]

必須 Seq[java.lang.Object]

最初の例とほぼ同じ理由で、コンパイルはできますが失敗します。やってみると

println(String.format(msg, (o :: List(os:_*)) :_* ))

これは、暗黙的な変換のあいまいさでコンパイルに失敗します (any2ArrowAssocおよびany2stringadd)

4

2 に答える 2

67
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
  println( String.format(msf, (o :: os.toList).toArray : _* ))
于 2009-06-17T18:37:22.017 に答える
13
def foo(msf: String, o: AnyRef, os: AnyRef*) =
  println( String.format(msf, o :: os.toList : _* ) )

また

def foo(msf: String, o: AnyRef, os: AnyRef*) =
      println( msf format (o :: os.toList : _* ) )

locale* サポートはありませんが、私は後者を好みます。

  • Scala 2.8 では、RichString の形式でロケールがサポートされています。
于 2009-06-18T19:46:32.703 に答える