2016-06-22 15 views
2

Ich finde mich viel schreiben (Art) Vorwand Code. Zum Beispiel sagen, ich habe die folgenden MerkmaleScala Fall Klassen und Konstruktoren

trait Foo { 
    def x: Int 
} 

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

Dann möchte ich eine Fallklasse, die nicht mehr oder weniger als diese implementiert.

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

scheinen diese nicht ärgerlich, aber jetzt vorstellen, dass meine Züge ein Dutzend def jeweils s und dass die Namen x, y und z sind viel länger. Das Schreiben der Fallklasse bedeutet, dass ich alle diese Argumente als Argumente von MyClass neu schreiben muss.

Gibt es eine Möglichkeit, den x: Int, y: Boolean, z: String Konstruktorteil basierend auf den Eigenschaften, die ich erweitere, automatisch zu generieren?

+0

Nun, Sie können Def mit Def von Ihrer Fallklasse überschreiben. In diesem Fall müssten Sie diese Vals nicht erst generieren. Haben auch alle Implementierungen Ihres Merkmals val Implementierung seiner def? Wenn das der Fall ist, warum würdest du es als def in erster Linie haben und kein val? – tkachuko

+0

@tkachuko Angenommen, ich hätte "val" überall statt "def", wie hilft das? – Alec

+0

hilft es, in den Kontext zu gelangen, den Sie zu lösen versuchen. Sie benötigen eine Art Makro-Tooling: Haben Sie die hier genannten Bibliotheken überprüft: http://stackoverflow.com/questions/22850340/dynamic-creating-case-classes-with-macros? – tkachuko

Antwort

4

Ich denke, was Sie suchen, ist eine annotation macro, die diese Arbeit für Sie erledigen kann. Sie würden dann dieses Makro aufrufen, indem Sie so etwas wie dieses zu schreiben:

@FieldsFromTraits 
case class MyClass extends Foo with Bar 

Annotation Makros können dann Ihren Fall Klasse umschreiben mit Informationen aus den Zügen.

Eine Bibliothek, die etwas ähnliches tut, ist MetaRest. Sie könnten versuchen, diese Implementierung anzupassen. Ich werde sehen, ob ich heute Abend nichts zusammenstellen kann.

+0

Wow! Genau darüber habe ich nachgedacht. Ich denke, ich werde diese Implementierung anpassen. – Alec