2016-04-06 35 views
2

Ich habe ein Verfahren, in Scala, die eine feste Anzahl von Parametern, deren Signatur hat ich nicht ändern kann:Pass Seq als Parameter in Scala nicht-Vararg Verfahren

def myMethod(a1: Int, a2: Int, a3: Int): Int = { /* stuff happens */ } 

Ich habe auch ein Array arr mit genau der richtigen Anzahl von Elementen wie es Parameter in myMethod gibt. Wenn myMethod eine Vararg-Methode wäre, könnte ich die seltsame : _*-Notation verwenden, um das Array als Parameter zu übergeben. Ich möchte etwas tun, wie

myMethod(/*some Scala magic with arr*/) 

Gibt es eine Möglichkeit, dass elegant in Scala zu tun, die nicht myMethod benötigt werden Vararg?

Antwort

4

ich glaube, die nächst Sie dazu kommen können, ist das Array in einem Schritt dekonstruieren, bevor Sie Ihre Methode aufgerufen:

val Array(a1, a2, a3) = arr 
myMethod(a1, a2, a3) 
+0

OK, das ist cool. Ich habe nur gehofft, dass es eine obskure Funktion geben könnte, die das ermöglicht ... Danke! – Ian

+1

Beachten Sie, dass dies einen 'MatchError' auslöst, wenn das Array nicht genau 3 Elemente enthält. – Jesper

3

Beachten Sie, dass Sie vielleicht vielleicht nicht eine Signatur ändern können, aber man könnte eine Überlastung hinzufügen durch implizite Konvertierung

class A { 
    def myMethod(a1: Int, a2: Int, a3: Int): Int = 5 
} 

implicit class ExA(self: A) extends AnyVal { 
    def myMethod(arr: Array[Int]): Int = { 
    val Array(a1, a2, a3) = arr 
    self.myMethod(a1, a2, a3) 
    } 
} 

Und dann einfach können Sie Ihre Array übergeben, wenn es nicht drei Elemente lang ist wird ein Fehler in der Laufzeit erhalten.

scala> (new A).myMethod(Array(1, 2, 3)) 
res2: Int = 5 

Ohne extra Kenntnisse Compiler kann nicht so sicher, wie man über die Größe des Arrays und damit es scheint nicht zu einem Weg, um nur einige willkürlich Array in 3 Argumente zu erweitern und es in ein setzen Funktion.