Scala case class,修改构造函数中的一个参数

Scala case class, modify a parameter in constructor

我有案例class

case class SiteID(channel: String, locale: String)

语言环境可以是 "en-GB" 或 "en_GB" 。所以我想用下划线替换连字符。

思路是变换,所以就有了这个等式

SiteID("blabla","en-GB") == SiteID("blabla","en_GB")

我尝试使用以下代码

case class SiteID(channel: String, locale: String)

object SiteID{

  def apply(channel: String, locale: String):SiteID =  SiteID(channel,locale.replace("-","_") )
}

您可能正在递归调用伴生对象的 apply 方法。 尝试使用新运算符。

 object SiteID {
    def apply(channel: String, locale: String):SiteID =
       new SiteID(channel,locale.replace("-","_") )
 }

使用 Scala case class 构造,编译器会自动为您生成带有声明参数的 apply 方法。如果您声明另一个参数类型与您的案例 class 相同的参数类型,则它优先于编译器生成的参数类型。

因此,正如另一个答案中所述,您的 apply 方法正在递归调用自身;提供了一个解决方案。如果您还需要确保不会实例化任何 SiteID("bla","en-GB") 值,您应该将案例 class 的构造函数声明为私有的:

case class SiteID private(channel: String, locale: String)

object SiteID {
    def apply(channel: String, locale: String):SiteID =
        new SiteID(channel,locale.replace("-","_") )
}

SiteID("bla","en-GB") //SiteID(a,en_GB)
new SiteID("bla","en-GB") //error