3

newこれを機能させるにはどうすればよいですか、キーワードの有無にかかわらず試しました:

object Main extends App {
    override def main (args : Array[String] = new Array("default argument")) {
        println("args(0) = " + args(0))
    }
}

http://ideone.com/5AyTxy (他の[ 1、2]の方法も試しましたが、問題が発生していると思いvalます)

ドキュメント: http://docs.scala-lang.org/sips/completed/named-and-default-arguments.html#default_arguments

argsPS: これを名前にバインドすることを確認する必要があります。var別のまたはにではなくval。さらに、スコープは 内でグローバルである必要がありますmain

4

3 に答える 3

6

2 つの注意事項:

1) App を拡張すると、オブジェクトの本体が主な機能になります。「args」は提供された値であり、そのまま使用できます。

object MyApp extends App {
  println(args)
}

2) main は常に引数付きで呼び出されます。そうしないと Scala (および Java) に一貫性がなくなるため、これは理にかなっています。JVM は、引数リストをメイン関数に渡す前に、引数があるかどうかをテストしません。その場合、main(Array("args")) を呼び出すこともあれば、main() を呼び出すこともあり、問題が発生します。

これを行うより良い方法は、実際に args をそのまま使用することです。

object MyApp extends App {
  println(args.toList.headOption.getOrElse("Default first argument"))
}

ただし、複数の引数が必要な場合は、実引数解析ライブラリをチェックアウトする必要があります。 scoptをお勧めします。

于 2013-10-07T05:30:55.550 に答える
5

ここであなたの意図を満たすために(@AlexIvの回答に対する最後のコメントで明確になったように)-フィールドargsのデフォルト値を許可しながらフィールド名を保持します-次のプレフィックスが付いた元の値への参照を使用して、フィールドをオーバーライドできますsuper.

object Main extends App {
    override val args: Array[String] = if (super.args.isEmpty) Array("default argument") else super.args
    println("args(0) = " + args(0))
}
于 2013-10-07T10:57:24.640 に答える