2016-06-22 2 views
2

私は多くの(ある種の)定型文を書いています。たとえば、次のような特性があるとします。スカラのケースクラスとコンストラクタ

trait Foo { 
    def x: Int 
} 

trait Bar { 
    def y: Boolean 
    def z: String 
} 

次に、これらを実装する以上の、またはそれ以下のケースクラスが必要です。

case class MyClass(x: Int, y: Boolean, z: String) extends Foo with Bar 

これは迷惑なようですが、今、私の形質がダースdefのそれぞれを持っていることと名前がxy、およびzがはるかに長いことを想像しません。ケースクラスを書くことは、これらのすべてをMyClassの引数として書き直さなければならないことを意味します。

x: Int, y: Boolean, z: Stringコンストラクタパーツを、私が拡張した特性に基づいて自動的に生成する方法はありますか?

+0

まあ、defをケースクラスのdefでオーバーライドすることができます。その場合、最初にこれらの値を生成する必要はありません。あなたの特性の実装には、そのdefの実装もありますか?それが最初の場所ではなく、ヴァルではなく、なぜそれを持っているだろうか? – tkachuko

+0

@tkachuko 'def'ではなく' val'をどこでも持っていたとしましょう。どうすればそれが助けになりますか? – Alec

+0

あなたが解決しようとしている文脈に入るのを助けます。何らかの種類のマクロツールが必要です。ここに記載されているライブラリをチェックしましたか?http://stackoverflow.com/questions/22850340/dynamically-creating-case-classes-with-macros? – tkachuko

答えて

4

あなたが探しているものは、この作品を処理できるannotation macroです。あなたはこのような何かを書くことで、このマクロを呼び出します:

@FieldsFromTraits 
case class MyClass extends Foo with Bar 

注釈マクロは、特性からの情報を使用してケースクラスを書き換えることができます。

同様のことをするライブラリはMetaRestです。その実装を適応させようとするかもしれません。私は今夜​​何かを一緒に置くことができないかどうかを見ます。

+0

うわー!これはまさに私が考えていたものです。私はその実装を一変させるつもりだと思う。 – Alec

関連する問題