【问题标题】:Scala case class, modify a parameter in constructorScala案例类,修改构造函数中的参数
【发布时间】:2018-06-21 09:05:03
【问题描述】:

我有一个案例类

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("-","_") )
}

【问题讨论】:

    标签: scala constructor apply case-class


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      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
      

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-10
        • 2013-03-16
        相关资源
        最近更新 更多