Scala 特性 : val/def and require

tintown 阅读:12 2024-09-07 23:24:14 评论:0

以下代码抛出 IllegalArgumentException :

trait T{ 
  val x: Long 
  require(x > 0) 
} 
 
object T extends App{ 
  val y = new T{ val x = 42L } 
} 

而以下没有:
trait T{ 
  def x(): Long 
  require(x() > 0) 
} 
 
object T extends App{ 
  val y = new T{ def x() = 42L } 
} 

这是为什么?什么时候 require()叫?为什么是 val甚至在那个时候定义?

请您参考如下方法:

因为 def声明一个方法,由编译器放在类中,所以一编译就存在。为了返回一些东西,一个方法必须运行到它实际返回一些东西的地方,所以在你的第二个例子中没有问题。
val声明一个“不可变值”,尽管它仍然需要初始化,在此之前它保存其类型的默认值 - 在这种情况下为 0。此初始化发生在 trait T 的构造函数之后。运行,除非您更改示例以使用早期初始化:

val y = new { val x = 42L } with T 


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号