2014-11-09 28 views
8

ben scala eşleşen bu desen ile ilgili bir soru ettik: Ben nasıl desen eşleştirme işleri ve scala onun kesişimi anlamak ettikDesen Eşleştirme Fonksiyon Argümanlar

val div: (Double, Double) => Double = { 
    case (x, y) if y != 0 => x/y 
} 

, ancak bu ifade beni deli. Complier, x ve y'nin, bunlarda işlev ve desen eşleşmesinin bir argümanı olduğunu nasıl biliyor?

cevap

9

Bunun kuralları, Scala Language Spesifikasyonu'nun 8.5 "Pattern Matching Anonymous Functions" bölümünde tanımlanmıştır. Desen eşleştirmesiyle anonim bir işlev kullanılıyorsa, türün kısmen sağlanmış olması gerekir. Bunu, Function2[Double, Double, Double] için kestirme olan tür (Double, Double) => Double olduğunu söyleyerek yaparsınız. Şimdi

:

beklenen tip scala.Function k [S1,…,Sk, R] ise, ifadesi anonim işlevine eşdeğer olarak alınır:

 
(x1:S1,…,xk:Sk) => (x1,…,xk) match { 
    case p1 => b1 … case pn => bn 
} 
Yani olursa olsun

ne fonksiyonunun Arity, desen eşleşmesi, işlevin argümanlarının bir tuple'sından geçirilir, dolayısıyla düzenli tuple extractor sözdizimini kullanabilirsiniz.

Yani örnek x ve y hayal gücüne kalmıştır çıkarıcı parametrelerinin adlandırma

val div: (Double, Double) => Double = (a, b) => (a, b) match { 
    case (x, y) if y != 0 => x/y 
} 

veya

val div = (a: Double, b: Double) => (a, b) match { 
    case (x, y) if y != 0 => x/y 
} 

için kısa. Ekstraktörün ortaya çıkan elemanlarını nasıl arayacağınıza karar verirseniz, case (foo, bar) => ...

yazabilirsiniz.