2017-07-13 2 views
2

Typen Ich mag diese Art von scala Liste erstellen:Wie eine Liste von Methoden erstellen und in scala

List(("Att1", getAtt1(), Int), 
    ("Att2", getAtt2(), BigDecimal), 
    ("Att3", getAtt3(), Long)) 

getAtt1, getAtt2 und getAtt3 stammen aus einem Java-Objekt in Scala importiert. Ich verwende den dritten Parameter der Liste, um die Konvertierung zu kennen. Zum Beispiel gibt getAtt3() ein Int zurück und meine Liste sagt mir, dass ich es in ein Long konvertieren muss.

Ich benutze Scala 2.11.8.

Haben Sie eine Idee?

+0

Dies ist ein guter Kandidat für eine Fallklasse nein? –

+0

In der Tat, aber wie kann ich eine Methode in meinem Fall Klassenfeld platzieren? –

+1

@ a.moussa können Sie Funktionstypen verwenden: 'Fall Klasse Conv (Name: String, get:() => Int, konvertieren: Int => Long)' –

Antwort

2

Sie können tatsächlich, wie in den Kommentaren erwähnt, eine Klasse verwenden, um dieses Problem zu lösen. Ich würde für eine Klasse mit 2 Typparametern und Umwandlungsmethode gehen. Etwas wie folgt aus:

> case class Attribute[Original, Target](name: String, value:() => Original)(converter: Original => Target) { 
    def convert = converter(value()) 
    } 
defined class Attribute 

> Attribute("three",() => 3)(_.toLong).convert 
res11: Long = 3L 

Bitte bemerke ich den converter Parameter der Fallklasse in seinen eigenen Parameterblock getrennt haben. Dies ist ein häufiger Trick in Scala, um mit Typinferenz zu helfen. Jetzt können Sie die Umwandlung von Int zu als nur _.toLong definieren. Wenn Sie die converter in denselben Parameterblock einfügen, müssen Sie bei der Instanzerstellung die vollständige Typensignatur angeben: Attribute("",() => 3, (i: Int) => i.toLong).

+0

sehr hilfreich, es ist, was ich gesucht habe:) –

Verwandte Themen