2011-10-31 38 views
7

iki örtük argüman ben şu sınıf var: Scala: Aynı beyanı

class Example(implicit doSomething1: (Double, Double) => Double, implicit doSomething2: (Double, Double) => Double) 
{ 
    //.. 
} 

Eğer yapıcı aynı yazısına iki örtük argümanları (fonksiyonlar) sahiptir Gördüğünüz gibi

. Fakat iki farklı tanımlamayı "enjekte etmek" istiyorum. Bu örtük bir şekilde mümkün mü? Yoksa sadece bilinen bir şekilde mümkün mü?

Teşekkür

cevap

0

Yaz

class Example(implicit doSomething1: (Double, Double) => Double, doSomething2: (Double, Double) => Double) 
{ 
    //.. 
} 

Ancak iki örtük argümanlar aynı tür varsa, bunlar besbelli aynı değere (hala açıkça farklı argümanlar geçebilir) sahip olacaktır

.

8

Derleyici, örtük kapsamda bir implicit (Double, Double) => Double ararsa, ya daha yüksek önceliğe sahip tam olarak bir tane vardır ve her ikisini birden seçer ya da yoktur (örtük kapsamda hiçbiri yoktur, ya da daha fazla) en yüksek önceliğe sahip olan) ve örtülü bir değer eksikliğinden dolayı bir hata olacaktır.

Eğer ayırt etmek isterseniz, ikisi de Function2'yi [Double, Double, Double] genişleten iki farklı türünüz olabilir. Örneğin, her iki işlemi bağımsız olarak seçmek mantıklı olabilir. İki seçenek conistent gerekiyorsa, bunu "doğal" örtük kapsamında uygun operasyonları olsun, yalnızca son olarak, tüm bu yararlıdır hem operasyon

trait Ring { 
    def add(x: Double, y: Double): Double 
    def mult(x: Double, y: Double): Double 
} 
// or `case class Ring(
//  addition: (Double, Double) => Double, 
//  multiplication: (Double, Double) => Double) 
class Example(implicit ring: Ring) 

ile sadece bir özelliği olması daha mantıklı olabilir. Yapmanız varsa siz de açık olabilir

implicit val addition = ... 
implicit val multiplication = 
new Example 

olduğu gibi bir örnek oluşturmak her zaman onları örtülü olun. aramaların çoğu aynı değere çalışmak bekleniyor ve eğer

Ayrıca, sadece birkaç tanesi değiştirmek istiyorum, yerine varsayılan değerlerle bağımsız değişkenler için gidebileceğini

class Example(doSomething1 : (Double, Double) => Double = <default value>, doSomething2 ...) 

Hatta olabilir her ikisi de, varsayılan değer ile örtülü bir argüman. Bunu yaparsanız, örtük bir değer bulunmadığında varsayılan değer kullanılır.