2015-02-06 44 views
5

Ben Scala uzmanı değilim, ben örtülü bir parametresi olan bir yöntemi çağırmak sözdizimi hakkında karıştı bir yöntemi çağrılırken. Böyle bir Spark RDD varFarklar (açık) örtük parametreleri

:

val myData: RDD[Array[String]] = ... 

ve bunun için bir nolarımız tanımlamış:

object MyOrdering extends Ordering[Array[String]] = ... 

Bu RDD filtrelemek ve almak istediğiniz İşte

benim durum Siparişime göre RDD'deki en üstteki n girişler.
def top(num: Int)(implicit ord: Ordering[T]): Array[T] 

Başlangıçta ben bu hata ile başarısız Bu kodu

myData filter { D => 
    D(9) == "yes" 
} top(50)(MyOrdering) 

çalıştı: Bir Kıvılcım RDD Bu imza ile üst n girişlerini germek için bir yöntem vardır Ancak

error: Int(50) does not take parameters 
    } top(50)(MyOrdering) 

, Bu kod çalışır:

myData.filter(D => D(9) == "yes").top(50)(MyOrdering) 
Benim acemi göz için, başarısız kod örneği ve işçi kod örneği göz eşdeğer mantığı belirterek edilecek. Burada yanlış mıyım? İki kod örneğinde aslında farklı bir şey yapıyorum? Yoksa Scala derleyicisinin kodu nasıl ayrıştırdığıyla ilgili bir sorun mu var?
+1

Hata, ilkinin, benzer şekilde '(myData) {) (myData filter {D => D (9) ==" yes "}) (50 (MyOrdering))', '(50)' nin alınmadığı şekilde ayrıştırıldığını gösterir. bir yöntem parametresi olarak. hata bildirdi minimal '50 ile yeniden olabilir ("Merhaba!")' mesela. Bu bile, nasıl ayrıştırmak gelmez örtülü (ek parametre listesi) olmadan mı? Yoksa sadece sözdizimi davranışını değiştiren bu ek? 'örtülü val myOrd: bu işler, örneğin, iyi çalışır örtülü parametre listesi olmadan – user2864740

+0

Sipariş [Dizi [dize]] = MyOrdering' ' myData filtre {D => D (9) == "evet" } üst (50) 'kıvılcım olmadan –

+0

daha basit bir örnek listesi (1, 2, 3, 4) filtre (_> 2) SortBy (_ * -1) (scala.math.Ordering.Int)' –

cevap

1

. noktasını, yöntem birleşim-1 (1 parametre listesi) veya arity-0 (parametre listesi yok) olduğunda yalnızca yöntem çağırma alanı için değiştirebilirsiniz. Son parametre listesi implicit olduğunda yöntem, implicit bağımsız değişken ile çağrılan eğer Arity n-1 varmış gibi

class Foo { 
    def baz(x: Int)(y: Int) = this 
    def qux(x: Int) = this 
} 

(new Foo) baz(1)(1) //Does not compile 
(new Foo).baz(1)(1) //Allowed 
(new Foo) qux(1) //Allowed, since qux is arity-1 
(new Foo).qux(1) //Also allowed, of course 

derleyici n parametre listeleri ile bir yöntem tedavi edebilir: Örneğin, bu derlenmeyecektir:

class Foo { 
    def baz(x: Int)(implicit y: Int) = this 
} 

implicit val y: Int = 1 
(new Foo) baz(1) //Allowed 
(new Foo).baz(1) //Also fine 
(new Foo) baz(1)(2) //Still not allowed 
(new Foo).baz(1)(2) //Still allowed 

the style guide yöntem çağırma ilişkin kurallar hakkında daha fazla bilgi.