복붙노트

[SCALA] 어떻게 22 개 필드의 스칼라 경우 클래스의 제한을 극복하기 위해?

SCALA

어떻게 22 개 필드의 스칼라 경우 클래스의 제한을 극복하기 위해?

스칼라의 경우 클래스는 생성자 (22 개) 필드의 제한이 있습니다. 나는 케이스 클래스와 함께 작동 상속 또는 조성물과 그것을 할 수있는 방법이이 한도를 초과 할?

해결법

  1. ==============================

    1.최근에 (육년 영업 후 년 10 월 2016), 리처드 Dallaway에서 블로그 게시물 "스칼라 22은"그 한계는 탐구 :

    최근에 (육년 영업 후 년 10 월 2016), 리처드 Dallaway에서 블로그 게시물 "스칼라 22은"그 한계는 탐구 :

    Case classes with > 22 parameters are now allowed. 
    

    즉, 여전히 경우 클래스 필드의 수에 제한이 존재 말했다에게, https://stackoverflow.com/a/55498135/1586965를 참조하십시오

    import slick.driver.H2Driver.api._
    import shapeless._
    import slickless._
    
    class LargeTable(tag: Tag) extends Table[Large](tag, "large") {
      def a = column[Int]("a")
      def b = column[Int]("b")
      def c = column[Int]("c")
      /* etc */
      def u = column[Int]("u")
      def v = column[Int]("v")
      def w = column[Int]("w")
    
      def * = (a :: b :: c :: /* etc */ :: u :: v :: w :: HNil)
        .mappedWith(Generic[Large])
    }
    
  2. ==============================

    2.이 문제는 스칼라 2.11에서 수정 될 것입니다.

    이 문제는 스칼라 2.11에서 수정 될 것입니다.

  3. ==============================

    3.이 경우 클래스와 같은 역할을하는 일반 클래스를 구축 할 수 있습니다.

    이 경우 클래스와 같은 역할을하는 일반 클래스를 구축 할 수 있습니다.

    그 스파크가 지원하는 최신이며, 스파크-SQL에서 나는 경우 클래스를 많이 사용 무엇 때문에 나는 아직도 스칼라 2.10.X를 사용합니다.

    22 개 이상의 필드가있는 경우 클래스에 대한 해결 방법 :

    class Demo(val field1: String,
        val field2: Int,
        // .. and so on ..
        val field23: String)
    
    extends Product 
    //For Spark it has to be Serializable
    with Serializable {
        def canEqual(that: Any) = that.isInstanceOf[Demo]
    
        def productArity = 23 // number of columns
    
        def productElement(idx: Int) = idx match {
            case 0 => field1
            case 1 => field2
            // .. and so on ..
            case 22 => field23
        }
    }
    
  4. ==============================

    4.그것은 당신의 생성자를 흥미하면 해당로드입니다,하지만 당신은 자신의 경우 클래스에 관련된 값을 패키징 할 수 있습니다.

    그것은 당신의 생성자를 흥미하면 해당로드입니다,하지만 당신은 자신의 경우 클래스에 관련된 값을 패키징 할 수 있습니다.

    당신이있을 때 그래서

    case class MyClass(street: String, city: String, state: String, zip: Integer)
    

    이 작업을 수행 할 수 있습니다

    case class MyClass(address: Address)
    

    당신도 다른 옵션이 있습니다 :

    업데이트 : 다른 사람이 언급 한 바와 같이,이 더 이상 스칼라 2.11의 출시 후 문제 없다 - 나는 용어를 사용하는 것을 주저 것이지만 "수정." 당신이 경우 그러나, 때로는 여전히 타사 스칼라 라이브러리에 표시, "22 잡아라".

  5. ==============================

    5.당신은 많은 값을 가질 때, 일반적으로 설계 어쨌든 재 작업해야하는 기호입니다.

    당신은 많은 값을 가질 때, 일반적으로 설계 어쨌든 재 작업해야하는 기호입니다.

    간헐적 인 경우 클래스 다음으로 큰 응집체를 형성한다. 이것은 또한, 대한 이유를 이해하고 유지하기 위해 코드를 훨씬 쉬워집니다. 뿐만 아니라 당신이 겪고있는이 문제를 우회있다.

    나는 사용자 데이터를 저장하기를 원한다면 예를 들어, 나는이 작업을 수행 할 수 있습니다 ....

    case class User(name: Name, email: String)
    case class Name(first: String, last: String)
    

    그래서 몇 가지로, 물론이 필요하지 않을 것입니다. 당신은 하나 개의 클래스에 벼락 공부하려고 22 일이있는 경우, 당신은 어쨌든 간헐적 인 경우 클래스 - 작업의 이런 종류의 작업을 수행 할 수 있습니다.

  6. from https://stackoverflow.com/questions/20258417/how-to-get-around-the-scala-case-class-limit-of-22-fields by cc-by-sa and MIT license