私はちょうどあなたが型崩れなどの一切のライブラリを望んでいない気づきました。それがどんな慰めであれ、これは最終的にマクロを反映するスカラーを置き換えるライブラリなので、ホイールを再構築することなくあなたが得る純粋なスカラとほぼ同じです。
私はこれに役立つかもしれない何かがあると思います。それは一種の重い解決策ですが、私はそれがあなたが求めていることをすると思います。
静的な注釈を作成するために、これは素晴らしいスケーラメタ(http://www.scalameta.org)ライブラリを使用します。あなたのケースクラスに注釈を付けると、このインラインマクロはあなたのコマンドライン引数に対して適切なscoptパーサを生成します。
あなたのbuild.sbtは、scalametaライブラリと同様、マクロparadiseプラグインが必要になります。これらをプロジェクトに追加することができます。
addCompilerPlugin("org.scalameta" % "paradise" % paradise cross CrossVersion.full)
libraryDependencies ++= Seq(
"org.scalameta" %% "scalameta" % meta % Provided,
)
これらのdepsをビルドに追加したら、マクロ用に個別のプロジェクトを作成する必要があります。モジュール自体は、「マクロ」と命名されている場合は
完全SBTプロジェクトの定義は、クラスを作成し、ここに静的な注釈で、
lazy val macros = project
.in(file("macros"))
.settings(
addCompilerPlugin("org.scalameta" % "paradise" % paradise cross CrossVersion.full),
libraryDependencies ++= Seq(
"org.scalameta" %% "scalameta" % "1.8.0" % Provided,
)
)
ようになります。
その後、メインモジュールはマクロモジュールに依存します。次に、これは、コンパイル時にscopt定義を含めるために、あなたのケースクラスを拡大していきますので...
@Opts
case class Options(name: String, job: String, age: Int, netWorth: Double, job_title: String)
のようなあなたのケースクラスに注釈を付けることができます。ここでは、生成されたクラスを上から見たものがあります。
case class Options(name: String, job: String, age: Int, netWorth: Double, job_title: String) {
import scopt._
def options: OptionParser[Options] = new OptionParser[Options]("Options") {
opt[String]("name").required().action((x, c) => c.copy(name = x)).text("name is required.")
opt[String]("job").required().action((x, c) => c.copy(job = x)).text("job is required.")
opt[Int]("age").required().action((x, c) => c.copy(age = x)).text("age is required.")
opt[Double]("netWorth").required().action((x, c) => c.copy(netWorth = x)).text("netWorth is required.")
opt[String]("job_title").required().action((x, c) => c.copy(job_title = x)).text("job_title is required.")
}
}
これはあなたのボイラープレートのトンを保存する必要があり、私はこれの専門家ではないですので、インラインマクロのより多くの知識を持つ人のために、私はこれより良いを書くことができる方法を教えて気軽にしてください。
これに関する適切なチュートリアルとドキュメントはhttp://scalameta.org/tutorial/#Macroannotationsにあります。この方法についてご質問がある場合は、お答えいたします。
"scala option parser"とは、[scopt](https://github.com/scopt/scopt)を意味すると思いますか? – thibr
あなたがこれをやりたいなら、あなたは形を変えることができます。あなたは 'LabelledGeneric'のようなものを探しています。 – Alec
@Alec、車輪を再実装するのは、短いコードを書くだけで十分です。 – zinking