>

케이스 클래스가 있습니다

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

  • 답변 # 1

    아마도 컴패니언 객체의 apply 메소드를 재귀 적으로 호출하고있을 것입니다. 새 연산자를 사용해보십시오.

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

  • 답변 # 2

    스칼라 case class 와 함께  구성, 컴파일러는 자동으로 apply 를 생성합니다  선언 된 매개 변수를 사용하는 방법. 케이스 클래스와 동일한 매개 변수 유형을 사용하여 다른 유형을 선언하면 컴파일러에서 생성 된 유형보다 우선합니다.

    따라서 당신의 apply 에 다른 답변에서 언급했듯이  메소드는 재귀 적으로 호출됩니다. 해결책이 제공되었다. 추가로 SiteID("bla","en-GB") 가 없는지 확인해야하는 경우  값이 인스턴스화됩니다. 케이스 클래스의 생성자를 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
    
    

관련 자료

  • 이전 잡히지 않은 php 예외 mongodb \ driver \ exception \ authenticationexception - "인증 실패"
  • 다음 MySQL 동시 업데이트