如果不存在则采用默认值

问题描述 投票:0回答:1

trait
,如下所示

trait MyTrait
{
    val country: String,
    val state: String,
    val commune: String = "nothing"

}

现在实施

MyTrait

case class ImplementTrait(
               country:String,
               state: String,
               //commune, how to provide commune's default value if commune is not provided while initialising  ImplementTrait
) extends MyTrait

例如

ImplementTrait(country, state)
,应该可以工作,因为它将采用
commune
默认值

ImplementTrait(country, state, commune)
,也应该有效,因为
commune
值现在存在

有什么建议吗?

scala traits
1个回答
0
投票

我不认为你可以轻松地自动做一些事情,但如果你可能想考虑沿着这些思路做的事情:

object MyTrait {
  val DefaultCommune = "nothing"
}

trait MyTrait {
  def country: String
  def state: String
  def commune: String
}

final case class ImplementTrait(
    country: String,
    state: String,
    commune: String = MyTrait.DefaultCommune
) extends MyTrait

assert(ImplementTrait("Germany", "Bayern").commune == "nothing")
assert(ImplementTrait("Mexico", "Yucatan", "Merida").commune == "Merida")

您可以在 Scastie 上使用此代码

请注意我对您最初的建议所做的一些更改,作为进一步的反馈:

  1. val
    中没有
    trait
    :您当然最了解您想要涵盖的用例,但一般来说,
    val
    中的
    trait
    往往不被鼓励,因为您继承特征的顺序可能会影响类的初始化(更多细节请参见here
  2. final case class
    :虽然您不能在案例类之间直接继承,但您可以让普通类从案例类继承——这不太可能是您想要的,并且可能会影响值语义,这就是为什么通常建议将所有案例都设为案例期末课程(请参阅此处了解更多详细信息)
© www.soinside.com 2019 - 2024. All rights reserved.