2016-03-07 88 views
1

为什么我不能在类的主体中定义构造函数arg myval?例如特质是无法看到的构造ARG如下所示:Scala:为什么自我类型特征不能看到构造函数参数

scala> class A(myval: String){} 

scala> trait B { 
    | this: A => 
    | println(myval) 
    | } 
<console>:8: error: not found: type A 
     this: A => 
     ^
<console>:9: error: not found: value myval 
     println(myval) 
     ^

我不得不在类的身体再次声明构造ARG。

scala> class A(_myval: String){ val myval = _myval} 
defined class A 

scala> trait B { 
    | this: A => 
    | println(myval) 
    | } 
defined trait B 

有人可以帮我理解这是为什么吗?

回答

1

这是因为class默认情况下没有定义吸气剂,因此您无权访问myval

如果你这样做:

class A(_myval:String) { 
def myval = _myval 
} 

trait B { 
this : A => println(myval)} 

这个工程。

您的示例将按“原样”使用case class,因为自动获取器会自动生成。

编辑:根据Rob Starling的评论,您可以将类定义缩短为class A(val myval:String)

+0

谢谢 - 这是我现在所做的。但是我在身体中定义的任何val都可用。 – JasonG

+2

您甚至可以通过将'A'定义为'class A(val myval:String);' –

+0

@JasonG yes来更简洁地做到这一点,因为Scala中的默认可见性是'public'。 @Rob好的提示不知道。 – Esardes

相关问题