2016-04-06 11 views
2

Ben imza parametrelerinin sabit sayıda Scala'da bir yöntem ben değiştiremem var:Geçiş Seq olarak Scala olmayan vararg yönteminde parametreler

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

Ben de tam doğru numarası ile bir dizi arr var elemanların myMethod parametresinde olduğu gibi. myMethod bir vararg yöntemiyse, diziyi parametre olarak geçirmek için garip : _* gösterimini kullanabilirdim. Ben vararg olmak myMethod gerektirmez Scala zarif bunu bir yolu var mı

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

böyle bir şey yapmak istiyorum?

cevap

4

Bunu gelebilir en yakın senin yöntemi çağrılırken önce adımda dizi yapısızlaştırmak olduğunu düşünüyorum: belki belki bir imza değiştiremezsiniz

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

Tamam, bu harika. Sadece bunu mümkün kılacak belirsiz bir özellik olabileceğini umuyordum ... Teşekkürler! – Ian

+1

Dizinin tam olarak 3 öğe içermemesi durumunda bunun bir "MatchError" a sahip olacağını unutmayın. – Jesper

3

Not ancak bir aşırı ekleyebilirsiniz değil 3 elemanları çalışma zamanında bir hata alırsınız iple ise örtük dönüşüm yoluyla

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) 
    } 
} 

sonra basitçe, dizinizi geçebilir. herhangi bir ekstra bilgi derleyici olmadan

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

dizinin boyutu hakkında senin kadar emin olamaz ve bu nedenle sadece 3 argümanlar bazı keyfi dizi genişletmek ve içine koymak için bir yol olarak görünmüyor işlevi.

İlgili konular