9

Javaでコマンドライン引数の処理をデバッグするとき、私は慣れています

args = new String[] { "some", "new", "arguments" };

(頻繁に変更するファイル名を引数として持っているが、IDE でいくつかのダイアログ ウィンドウを通過したくない場合に特に便利です)。これには、リリースをビルドするときに行をコメントアウトするだけで済むという利点があります。

これを Scala で試したところ、引数がvals であることがわかりました。var(そして、パラメータの前に書くことはできません)。

  • Q1 : その理由は何ですか?
  • Q2:そうする以外に明らかな回避策はありますか

    val newArgs = if (...) args else Array("some", "new", "arguments")
    

    newArgs残りのメインメソッドに固執しますか?

4

3 に答える 3

13

Q1:入力パラメーターを変更することは、スタイルが悪いと見なされることが多く、コードについての推論が難しくなります。

Q2:何かを行う前に を にargs割り当てることができます。var

于 2011-03-17T08:22:37.590 に答える
1

配列は変更可能であるため、次のように主張します。

Seq("some", "new", "arguments").copyToArray(args, 0, 3)

もちろん、これは、渡された配列に十分なスペースがある場合にのみ機能します。

Scalaのデフォルトのパラメーターを使用して、元のプローブをはるかにクリーンな方法で解決できることを忘れないでください。

于 2011-03-17T12:12:50.910 に答える
0

関数内の引数のみを変更したい場合は、説明のアプローチで十分です。

ただし、それを真の「参照」型として扱い、変更を関数の外部で有効に保つ必要がある場合は、引数をケースクラスでラップできます。次に例を示します。

case class Ref[A](var value: A)

そして、次のように使用します。

def modify(refInt: Ref[Int]) = refInt.value = 3

次に、refInt.value関数の外で使用すると、まだ 3 になります。

于 2017-10-07T20:14:10.390 に答える