2011-08-02 15 views
8

sınıfındaki özel değişkene erişemiyor Scala REPL'den gelen garip bir davranış.Tamamlayıcı nesne,

class CompanionObjectTest { 
    private val x = 3 
} 
object CompanionObjectTest { 
    def testMethod(y:CompanionObjectTest) = y.x + 3 
} 

özel değişken repl içinde refakatçi nesneden erişilebilir olması görünmüyor:

scala> class CompanionObjectTest { 
    | 
    | private val x = 3; 
    | } 
defined class CompanionObjectTest 

scala> object CompanionObjectTest { 
    | 
    | def testMethod(y:CompanionObjectTest) = y.x + 3 
    | } 
<console>:9: error: value x in class CompanionObjectTest cannot be accessed in CompanionObjectTest 
     def testMethod(y:CompanionObjectTest) = y.x + 3 
               ^

Neden oluyor ki bir sorun olmadan aşağıdaki derlemesinin rağmen

?

cevap

13

Ne oluyor Repl her "satır" aslında farklı bir pakete konulur, böylece sınıf ve nesne arkadaşları olmak kalmamasıdır: Burada örnek bir REPL oturumdur.

Yap zincir sınıfı ve nesne tanımları:

scala> class CompanionObjectTest { 
    | private val x = 3; 
    | }; object CompanionObjectTest { 
    | def testMethod(y:CompanionObjectTest) = y.x + 3 
    | } 
defined class CompanionObjectTest 
defined module CompanionObjectTest 

Kullanım macunu modu:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class CompanionObjectTest { 
    private val x = 3 
} 
object CompanionObjectTest { 
    def testMethod(y:CompanionObjectTest) = y.x + 3 
} 

// Exiting paste mode, now interpreting. 

defined class CompanionObjectTest 
defined module CompanionObjectTest 
bir nesne içindeki

koyun her şey:

scala> object T { 
    | class CompanionObjectTest { 
    |  private val x = 3 
    | } 
    | object CompanionObjectTest { 
    |  def testMethod(y:CompanionObjectTest) = y.x + 3 
    | } 
    | } 
defined module T 

scala> import T._ 
import T._ 
birkaç şekilde bu çözebilir
2

Bu gerçekten biraz garip. Bu soruna geçici bir çözüm bulmak için, önce :paste ile yapıştırma modunu girmeli, ardından sınıfınızı ve eşlik eden nesneyi tanımlayın ve CTRL-D ile yapıştırma modundan çıkın.

Welcome to Scala version 2.9.0.1 (OpenJDK Server VM, Java 1.6.0_22). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class A { private val x = 0 } 
object A { def foo = (new A).x } 

// Exiting paste mode, now interpreting. 

defined class A 
defined module A 

scala>