2017-01-06 3 views
0

Ist es generell möglich, alle Argumente/Konstruktorparameter zu erhalten, die einer Klasse übergeben werden?Alle an eine Klasse in Scala übergebenen Argumente erhalten

Etwas wie:

trait GetMyArgs { 
    def myArgs = ??? 
} 

class Foo(i: Int, d: Double) extends GetMyArgs 

=>

scala> val f = new Foo(5, 6.6) 
scala> f.myArgs 
(5, 6.6) // or similar 
+2

Was möchten Sie tun? die Verwendung von Reflektion wird im Allgemeinen unterbunden – daydreamer

+0

siehe http://scalameta.org/ – pedrorijo91

+0

Danke, @daydreamer Ich mache im Wesentlichen eine Form der Memoisierung, es gibt eine gute Möglichkeit, dies zu tun, indem ich eine Funktion als Map implementiere, aber dies hat die schöne Eigenschaft, die Erinnerung an eine bestehende Funktion zu mischen. – spiffman

Antwort

0
def myArgs = { 
    this.getClass.getDeclaredFields 
     .toList 
     .map(i => { 
     i.setAccessible(true) 
     i.getName -> i.get(this) 
     }).toMap 
    } 

Sie können nur javareflection verwenden, um dies zu tun. aber muss aufgerufen werden, wenn die Variable nicht verwendet wird und der Konstruktorparameter nicht val ist, wird die myArgsleer ausgebenMap.

+0

Danke! Es ist eigentlich eine gute Eigenschaft, keine Variablen einzuschließen, die in meinem Fall nicht als Mitglieder verwendet oder gespeichert werden. Was ich suchte, ist im Wesentlichen ein "Fingerabdruck" für eine bestimmte Instanz einer konstruierten Klasse. Wenn also eine Variable unterschiedlich ist, aber die Klasse dieselbe ist, sollten sie denselben Fingerabdruck haben. – spiffman

+0

Ich sollte auch beachten, dass dies im Wesentlichen ist, was die 'hashCode'-Funktion für eine Fallklasse tut. – spiffman

Verwandte Themen