scala中奇怪的class / trait init命令

时间:2014-07-20 12:04:26

标签: scala

为什么以下代码打印为null,而不是" Test?

trait Testa {
  val loginurl:String
  def fun
  val x=fun
}

class Testc extends  Testa {
  val loginurl="test"
  def fun={
    println(loginurl)
    1
  }
}

object TestTrait extends App{
  val m=new Testc()
}

1 个答案:

答案 0 :(得分:3)

变量x初始化为属于Testa的特征的一部分。那时,您的Testc尚未在范围内,因此无法使用其中定义的方法fun。但是变量已经绑定到该方法。因此,调用Testc时不会打印任何内容。

顺便说一下,如果您将x的定义从val x = fun更改为lazy val x = fun,然后在创建对象m后调用此变量,那么您就是&#39 ;看到"测试"印刷(一次)。但是,x的类型仍然是" Unit",因为它是在基本特征中定义的。

trait Testa {
  val loginurl:String
  def fun
  lazy val x=fun
}

class Testc extends  Testa {
  val loginurl="test"
  def fun={
    println(loginurl)
    1
  }
}

scala> val testc = new Testc
testc: Testc = Testc@4106db23

scala> val testcx = testc.x
test
testcx: Unit = ()

scala> val testcx2 = testc.x
testcx2: Unit = ()