Scala case类,在构造函数中修改参数

时间:2018-06-21 09:05:04

标签: scala constructor apply case-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("-","_") )
}

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

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