2012-02-20 35 views
10

Ayarlayıcılarda birden fazla parametre kullanabilir miyim? ÖrneğinScala belirteçleri - çoklu parametre

:

private var _a = 0 
def a = _a 
def a_= (b: Int, c: Int) = _a = b + c 

evet, ben ayarlayıcı yöntemini çağırabilirsiniz nasıl?

+0

Tuples iyidir: kendi iç operasyonlar durumda

gibi görünebilir. Ayrıca, 'update()' yöntemini kullanmayı düşünün, ör. def güncelleme (p1: T1, p2: T2, p3: T3, v: V) 'sonra yazabilirsiniz' obj (p1, p2, p3) = v' – tuxSlayer

+0

Ve evet, yine de buna 'obj.a_ diyebilirsiniz = (1, 2) 'fakat muhtemelen bir 'ayarlayıcı' değil;) – tuxSlayer

cevap

9

Bir tuple nedir? Eğer garip tuple erişim sözdizimi beğenmezseniz

class A { 
    private var _a = 0 
    def a = _a 
    def a_= (t: (Int, Int)) { 
    _a = t._1 + t._2 
    } 
} 

:

class A { 
    private var _a = 0 
    def a = _a 
    def a_= (t: (Int, Int)) { 
    t match { 
     case(b, c) => _a = b + c 
    } 
    } 
} 

Kullanımı: Eğer diğer iki değerlerden tek bir değeri ayarlamak gerekiyorsa

val x = new A() 
x.a = (3, 7) 
x.a //10 
+0

Bunun nasıl çağrıldığına dair bir örnek var mı? (Hiç bu kadar güzel çalışmam mümkün olmamıştı ... en azından şu anda [2.8].) –

+0

@pst: bir örnek ekledi, işe yaradıyor (?) –

+0

İlerlemeden kurtulun :) –

1

muhtemelen değil 'setter'. Bu işleme anlamlı bir isim vermeyi veya bu sınıftan çıkarmayı düşünün.

private var _s: Whatever = // init 
def s_=(newValue: Whatever): Unit = _setter = newValue 
... 
implicit def t2whatever(t: (SomeTypeA, SomeTypeB)): Whatever = // some logic here 

şimdi bizim setter ancak ayarlayıcı anlamsal ezilmiş değildir düz küpe gibi az ya da çok aynı

obj.setter = sta -> stb 
// or 
obj.setter = (sta, stb) 

diyoruz cal.

class Z { 
    private var _s = // init 

    def s = _s 
    def s_=(newValue: S) = _s = newValue 
} 

object Z { 
    def toS(a: S, b: S): S = ChineseZodiac.choose(0.14 * a, math.PI + b) 
} 

ve sonra

obj.s = Z.toS(1, 2) 
+0

Teşekkürler. Setter semantiğinin değiştirilebileceğini anlıyorum, ama bazen o sette küçük bir kodda kullanıyorum ve bu kodu başka bir nesneye ya da sınıfa ayırmazsam daha kolay görünüyor. –

İlgili konular