2010-05-04 22 views
7

Ben Scala tedavi yöntemleri özel olarak _= biten hatırlar gibiyim, bu nedenle böyle bir şey:Scala yöntemleri _ =

object X { var x: Int = 0; def y_=(n : Int) { x = n }} 

X.y = 1 

X.y_=(1) çağırmalıdır. yanı sadece parantez olmadan yöntemi çağırmak için çalışıyor, İlginç

<console>:6: error: value y is not a member of object X 
     X.y = 1 
     ^

başarısız: Ancak, 2.8.0 RC1, bir hata mesajı alıyorum

scala> X.y_= 1 
<console>:1: error: ';' expected but integer literal found. 
     X.y_= 1 
      ^

benim gerçekte var bir şeyi misremembering muyum ya da bütün bir kumaştan mı icat ettim?

cevap

13

Bu, Scala'daki köşe durumlarından biridir. numaralı bir alıcı olmadan ve arasındaki bir ayarlayıcınız olamaz. ince

aşağıdaki çalışır:

scala> object X { 
    | var x: Int = 0 
    | def y = x 
    | def y_=(n: Int) { x = n } 
    | } 
defined module X 

scala> X.y = 45 

scala> X.y 
res0: Int = 45 
+1

Ah, teşekkürler! Bu sefer hatırlamaya çalışacağım. –

+1

Kesinlikle erişimci, mutajatör olmadan, sadece ilgili bir erişimci olmadan bir mutator değil. –

+0

@Randall: Teşekkürler, düzeltildi. (Yazdığımda ne düşündüğümü Dunno.) – missingfaktor

3
scala> object X { var x: Int = 0; def y_=(n : Int) { x = n }} 
defined module X 

scala> 

scala> X y_= 1 

scala> X.x 
res1: Int = 1 

scala> object X { var x: Int = _; def y = x ; def y_=(n: Int) { x = n } } 
defined module X 

scala> X.y = 1 

scala> X.y 
res2: Int = 1 

scala>