Черта App для факторинга - PullRequest
4 голосов
/ 12 ноября 2011

У меня есть приложение, которое использует черту App, и все работает нормально.Но object, который наследуется от App, становится немного громоздким, поэтому я хотел бы разделить некоторые функции на черты.В частности, я бы хотел выделить обработку аргументов командной строки.

К сожалению, это не очень хорошо работает с DelayedInit.Так что это прекрасно работает:

object Main extends App {
  println("arguments are: "+ args.mkString.mkString(", "))
}

но это выдает NullPointerException:

trait CommandLineArguments { this: App =>
  println("arguments are: "+ args.mkString.mkString(", "))
}

object Main extends App with CommandLineArguments

Есть ли способ получить DelayedInit, чтобы "включить" смешанные черты?

1 Ответ

3 голосов
/ 12 ноября 2011

Выглядит странно, если написать что-то вроде этого, отлично работает:

trait CommandLineArguments { self: App => 
  delayedInit {
     println("arguments are: "+ args.mkString.mkString(", "))
  }
}

Но из scaladocs (http://www.scala -lang.org / api / current / index.html # scala.DelayedInit):

Классам и признакам, унаследовавшим признак маркера DelayedInit, код инициализации будет переписан следующим образом. [Код] становится delayedInit ([Код]) Код инициализации содержит все операторы и все определения значенийкоторые выполняются во время инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...