2013-08-12 22 views
7

'daki diğer bağımsız değişkenler açısından varsayılan adlandırılmış bağımsız değişkenleri tanımlar. Üç bağlı parametreyi depolayan bir vaka sınıfım var. Ben, herhangi iki parametrelerinden sınıfını inşa edebilir arkadaşı nesneyi tanımlamak için aşağıdaki örneğe görünüyor şey istiyorum, açıkçası yanlıştır:, scala

def test(start : Float = end - duration, duration : Float = end - start, end : Float = start + duration) { 
    require(abs(start + duration - end) < epsilon) 
    ... 
} 
val t1 = test(start = 0f, duration = 5f) 
val t2 = test(end = 4f, duration = 3f) 
val t3 = test(start = 3f, end = 5f) 

ne numaralar ı benzer kullanım sözdizimi almak için kullanabilir? Sen tip sınıfları kullanabilirsiniz

cevap

26

:

// Represents no argument 
object NoArg 

// Resolves start, duration, stop 
trait DurationRes[A,B,C] { 
    def resolve(s: A, d: B, e: C): (Float, Float, Float) 
} 

object DurationRes { 
    implicit object startEndRes extends DurationRes[Float, NoArg.type, Float] { 
    def resolve(s: Float, d: NoArg.type, e: Float) = (s, e-s, e) 
    } 
    implicit object startDurRes extends DurationRes[Float, Float, NoArg.type] { 
    def resolve(s: Float, d: Float, e: NoArg.type) = (s, d, s+d) 
    } 
    // etc. 
} 

def test[A,B,C](start: A = NoArg, dur: B = NoArg, end: C = NoArg) 
       (implicit res: DurationRes[A,B,C]) { 
    val (s,d,e) = res.resolve(start, dur, end) 
    // s is start, d duration, e end 
} 

test(start = 1f, end = 2f) 

Bu şekilde o bile güvenli yazıp gibi bir şey diyemezsin:

test(start = 1f) 

hatta

test() 
3

sonra küçük bir düşüncem başka bir çözümle geldim (daha iyi olduğunu iddia etmiyorum, sadece kabul edilebilir bir yaklaşım olup olmadığını bilmek istiyorum). O zaman siz val k = Klass(x = 5, y = 6)() yapabilirsiniz

object Klass { 
    def apply(x: Int, y: Int)(z: Int = x + y) = { 
    new Klass(x, y, z) 
    } 
    // and so on 
} 

ve Klass(5, 6, 11) örneğine başvurmak için val k olsun: class Klass(val x: Int, val y: Int, val z: Int) ve bir tamamlayıcı nesnesi: özü bir sınıf tanımlamaktır.

Ve

küçük bir kod miktarının biri muhtemelen işi yapmak için bir makro tanımlayabilirsiniz, ancak bu şimdilik benim için biraz zor, ama yine de ilginç bir hareket gerektiriyor.

Bir süre sonra Güncelleme

, ben senin durumunda parametrelerin sadece üç kombinasyonları olduğunu size belirtmek istiyorum, yüzden elle 3 apply() yöntemler sağlanması daha kolay olmaz ? apply(s, d), apply(s, e), apply(d, e) ihtiyaçlarınızı karşılamalıdır. Ve bu size bazı yazımlar kazandırır, çünkü diğer yaklaşımlarda temel olarak tüm bu durumları da kodlamanız gerekir.

+0

Bunun yalnızca bağımsız değişkenleriniz farklıysa çalışır. Java uyumluluğu nedeniyle bu tür uygulamalarda aşırı yükleme yapamazsınız. (Java'da argüman isimleri genel arayüzün bir parçası değildir). – gzm0