2013-10-07 2 views
1

Scala имеет странный недостаток, что я не могу создать аргумент по умолчанию в args. Вот моя последняя попытка:NullPointerException с созданием массива?

object Main extends java.lang.Object with ScalaObject with App { 
    override val args:Array[String]=Array(args.toList.headOption.getOrElse("f")) 
    println("args(0) = " + args(0)) 
} 

Выполнить код здесь: http://ideone.com/B20HBA

Исключение в нити "главного" java.lang.NullPointerException на scala.collection.mutable.ArrayOps $ ofRef $ .length $ extension (ArrayOps.scala: 114) at scala.collection.mutable.ArrayOps $ ofRef.length (ArrayOps.scala: 114) at scala.collection.SeqLike $ class.size (SeqLike.scala: 106) в scala .collection.mutable.ArrayOps $ ofRef.size (ArrayOps.scala: 108) в scala.collection.mutabl e.Builder $ class.sizeHint (Builder.scala: 69) в scala.collection.mutable.ListBuffer.sizeHint (ListBuffer.scala: 45) в scala.collection.TraversableLike $ class.to (TraversableLike.scala: 628) at scala.collection.mutable.ArrayOps $ ofRef.to (ArrayOps.scala: 108) в scala.collection.TraversableOnce $ class.toList (TraversableOnce.scala: 257) at scala.collection.mutable.ArrayOps $ ofRef. toList (ArrayOps.scala: 108) at Main $ delayedInit $ body.apply (Main.scala: 2) в scala.Function0 $ class.apply $ mcV $ sp (Function0.scala: 40) в scala.runtime. AbstractFunction0.apply $ mcV $ sp (AbstractFunction0.scala: 12) at scala.App $$ anonfun $ main $ 1.apply (App.scala: 71) в scala.App $$ anonfun $ main $ 1.apply (приложение. Scala: 71) на scala.collection.immutable.List.foreach (List.scala: 318) в scala.collection.generic.TraversableForwarder $ class.foreach (TraversableForwarder.scala: 32) at scala.App $ class.main (приложение. Скала: 71) в главном $ .main (Main.scala: 1) в Main.main (Main.scala)

+0

Я бы не квалифицировал его как «странный недостаток». Аргумент всегда предоставляется, но он может быть пустым. Это ваш код, чтобы реализовать остальную логику, если вас не устраивают пустые аргументы. –

ответ

2

Как @blast_hardcheese показал, вы не можете с пользой установить значение Вала к выражению зависимости от себя, что то, что происходит в вашем коде выше.

Если вам действительно нужно сделать, это (я не могу придумать причину, почему вы), вы можете ссылаться на исходное значение путем добавления super. перед ссылкой на исходное значение:

object Main extends App { 
    override val args: Array[String] = if (super.args.isEmpty) Array("f") else super.args 
    println("args(0) = " + args(0)) 
} 

Обратите внимание, что ваше исходное выражение потеряет любые предоставленные аргументы за пределами первого. Возможно, это было вашим намерением, но в случае, если это не так, вы хотели бы изменить его на нечто подобное выше.

+0

Отлично, это было именно то решение, которое я искал, спасибо! Также, если хотите, добавьте это как ответ на: [Аргументы по умолчанию главной функции Scala?] (Http://stackoverflow.com/questions/19217564), и я дам вам голосование + принятый ответ там;) –

+1

Очень щедрый из вас - я попытался ответить на Тейлор, чтобы ответить на вашу альтернативную формулировку проблемы. – Shadowlands

0

Я не верю, что можно на месте изменить значение, используя предыдущее значение , Я знаю, что невозможно переопределить значение в методе, то, что вы пытаетесь сделать, переопределяет определение из приложения mixin (которое, если я ошибаюсь, мешает вам даже использовать это значение).

Кроме того, чтобы использовать значение в построении значения, кажется, ссылается на нуль, предполагая, что это не поддерживается.

scala> val l = List(1,2,3,4) 
l: List[Int] = List(1, 2, 3, 4) 

scala> val l = l.map(_ * 2) 
<console>:8: error: recursive value l needs type 
     val l = l.map(_ * 2) 
      ^

scala> val l: List[Int] = l.map(_ * 2) 
java.lang.NullPointerException 
    at .<init>(<console>:8) 
    at .<clinit>(<console>) 
    at .<init>(<console>:7) 
    at .<clinit>(<console>) 
    ... 
+0

Любые идеи о том, как я могу передать аргументы по умолчанию внутри 'main' метода' object' в Scala, в то же время используя привязку имени 'args'? –

+0

Почему вы хотите сохранить привязку имени 'args'?Что не получится, если вы соответствующим образом указали новую переменную 'args2' и использовали ее? – Shadowlands

Смежные вопросы