2011-03-17 10 views
9

Al depurar el manejo en Java argumento de línea de comando que estoy acostumbrado a hacer¿Hay alguna manera de que los argumentos sean var en lugar de val?

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

(especialmente útil si tiene un nombre de archivo como argumento que cambia con frecuencia, pero no quieren pasar por algunas ventanas de diálogo en la IDE). Esto tiene la ventaja de que simplemente puedo comentar la línea cuando construyo un lanzamiento.

Así que cuando probé esto en Scala descubrí que los argumentos son val s. (Y no puedo escribir var delante del parámetro).

  • Q1: ¿Cuál es la razón de esto?
  • Q2: Entonces, ¿hay alguna solución alternativa obvia excepción de hacer

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

    y se adhieren a newArgs en el método principal restante?

Respuesta

13

P1: mutación de los parámetros de entrada es a menudo visto como un mal estilo y hace que sea más difícil de razonar sobre el código.

P2: puede asignar el args a un var antes de hacer nada con él.

+0

Q1, buen punto. Q2, sí. Eso es mejor que la If-line, porque entonces simplemente puedo comentar la reasignación como en el caso de Java. ¡Gracias! – aioobe

1

matrices son mutables, por lo que si usted insiste:

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

Eso hace, por supuesto, sólo funciona si hay suficiente espacio en la matriz pasada.

Recuerde que puede usar los parámetros predeterminados en Scala para resolver su prueba original de una manera mucho más limpia.

+0

¿Podría dar un ejemplo de dicho parámetro predeterminado para el método principal? – aioobe

+0

Ah, lo siento, me dejé llevar allí. No funciona, ya que en el caso de que no haya parámetros, se pasa una matriz vacía. Tal vez eso podría valer un cambio. – Raphael

0

Si solo desea modificar los argumentos dentro de la función, entonces su enfoque en la descripción es suficiente.

Sin embargo, si es necesario tratarlo como un verdadero tipo de "referencia" y mantener las modificaciones válida fuera de la función, se puede envolver los argumentos en una clase de caso, por ejemplo:

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

y utilizarlo como:

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

Entonces, cuando se utiliza refInt.value fuera de la función, aún sería 3.

Cuestiones relacionadas