在 Scala 特征中预处理(需要)未初始化值的 属性
Preconditioning (require) an uninitialized value's property in a Scala trait
鉴于以下特征,实例 a
抛出 NullPointerException
:
trait T {
val l: List[Int]
require(l.size > 1)
}
case class A(list: List[Int]) extends T {
override val l: List[Int] = list
}
val a = A(List(1,2))
基于 this Whosebug post,我为 T
尝试了以下变体:
trait T {
def l(): List[Int]
require(l().size > 1)
}
trait T {
val l: List[Int]
lazy val s: Int = l.size
require(s > 1)
}
trait T {
val l: List[Int]
def s: Int = l.size
require(s > 1)
}
但他们都给出了NullPointerException
。
有没有办法为特征中的未初始化值 属性 使用前提条件(require
子句),或者我是否必须将前提条件复制到所有 类实施特征?
假设 l
是 def
,解决该问题的一种方法如下:
case class A(list: List[Int]) extends {
val l: List[Int] = list
} with T
您可以按照以下方式轻松完成此操作:
scala> :paste
// Entering paste mode (ctrl-D to finish)
trait T {
def l: List[Int]
require(l.size > 1)
}
case class A(l: List[Int]) extends T
val a = A(List(1,2))
// Exiting paste mode, now interpreting.
defined trait T
defined class A
a: A = A(List(1, 2))
鉴于以下特征,实例 a
抛出 NullPointerException
:
trait T {
val l: List[Int]
require(l.size > 1)
}
case class A(list: List[Int]) extends T {
override val l: List[Int] = list
}
val a = A(List(1,2))
基于 this Whosebug post,我为 T
尝试了以下变体:
trait T {
def l(): List[Int]
require(l().size > 1)
}
trait T {
val l: List[Int]
lazy val s: Int = l.size
require(s > 1)
}
trait T {
val l: List[Int]
def s: Int = l.size
require(s > 1)
}
但他们都给出了NullPointerException
。
有没有办法为特征中的未初始化值 属性 使用前提条件(require
子句),或者我是否必须将前提条件复制到所有 类实施特征?
假设 l
是 def
,解决该问题的一种方法如下:
case class A(list: List[Int]) extends {
val l: List[Int] = list
} with T
您可以按照以下方式轻松完成此操作:
scala> :paste
// Entering paste mode (ctrl-D to finish)
trait T {
def l: List[Int]
require(l.size > 1)
}
case class A(l: List[Int]) extends T
val a = A(List(1,2))
// Exiting paste mode, now interpreting.
defined trait T
defined class A
a: A = A(List(1, 2))