Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala-在包含未实现变量的Trait中使用字符串插值_Scala_Inheritance_Traits - Fatal编程技术网

Scala-在包含未实现变量的Trait中使用字符串插值

Scala-在包含未实现变量的Trait中使用字符串插值,scala,inheritance,traits,Scala,Inheritance,Traits,假设我有以下特点 trait Feature{ val name:String val tableName = s"${name}_table" } 以及一个扩展它的类 class Feature1 extends Feature{ val name = "feature1" } 但是当我初始化类并打印tableName时,我得到的是“null\u table”,而不是“feature1\u table”。我试图完全理解这

假设我有以下特点

trait Feature{
     val name:String
     val tableName = s"${name}_table"
}
以及一个扩展它的类

class Feature1 extends Feature{
     val name = "feature1"
}
但是当我初始化类并打印
tableName
时,我得到的是“null\u table”,而不是“feature1\u table”。我试图完全理解这是为什么。这是因为
tableName
在Trait中从技术上实现,因此在扩展类实例化它之前,它接受
name
的空值吗?

“在Trait中从技术上实现,在扩展类实例化它之前,它接受name的空值”是

这是解决办法

trait Feature {
  def name: String
  final lazy val tableName = s"${name}_table"
}

final class Feature1 extends Feature {
  override final val name = "feature1"
}

另一种选择是使用
abstrac类
而不是
trait


Scala 3将引入特征参数来正确解决此问题。

请注意,
lazy val
是通过同步实现的,这会带来性能损失。如果在高性能多线程环境中操作成本较低,我建议使用
def