私はかなりの共通構造を共有する簡単なコマンドラインのScalaアプリケーションを多数持っています。それらのすべてがscala.Appから継承しています。これは問題ありません。これらのコマンドラインアプリの共有構造を共通の特性にリファクタリングして、私の(もっと簡単な)コマンドラインアプリクラスを継承することができます。この問題は、共通構造の中にコマンドライン引数の解析が含まれていることが原因で発生します。Scalaの特質のコマンドライン引数の取得
object MyScript extends BaseScript with App{
//small bits of business logic using components defined in BaseScript
}
trait BaseScript extends App{
val configuration = loadConfiguration(args(0))
//setup a bezillion components, usable from any of the scripts, based on the configuration
}
これはコンパイルが、それはargs
デリファレンス、実際に時間を来るときApp
形質がまだ初期化されていないと思われるので、NPEで失敗します。特性型の順序を変更し、BaseScriptのAppの継承を自己型宣言に変更すると、DelayedInitの実験と同様に何も起こりません。 BaseScriptでコンポーネントを「怠惰」と宣言すると、初期化中にこれらのコンポーネントを実際に使用する必要があります(たとえば、ログディレクトリの設定やコンフィグレーションに基づくJDBCドライバクラスのロードなど)。 BaseScriptの特性でコマンドライン引数を表示して初期化するためにできることはありますか?
:https://github.com/jstrachan/scopt – wheaties