복붙노트

[SCALA] 스칼라 열거 값을 재정의

SCALA

스칼라 열거 값을 재정의

지금까지 내가 말할 수있는 스칼라 값 (INT), 값 (문자열)과 가치 (INT, 문자열)에 대한 열거 값 클래스에 대한 정의가 있습니다.

다른 생성자를 지원하는 새로운 가치의 서브 클래스를 생성하는 예에 사람의 노하우를합니까?

내가 값을 가진 열거 만들려면 예를 들어, (INT, 문자열, 문자열) 객체, 나는 그것을 어떻게 할 것인가? 나는 열거 클래스를 사용하는 다른 모든 혜택을드립니다.

감사.

해결법

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

    1.열거 값은 발 클래스의 인스턴스가 있습니다. 이 클래스는 확장 할 수 있으며, 공장 방법을 추가 할 수 있습니다.

    열거 값은 발 클래스의 인스턴스가 있습니다. 이 클래스는 확장 할 수 있으며, 공장 방법을 추가 할 수 있습니다.

    object My extends Enumeration {
        val A = Value("name", "x")
        val B = Value("other", "y")
        class MyVal(name: String, val x : String) extends Val(nextId, name)
        protected final def Value(name: String, x : String): MyVal = new MyVal(name, x)
    }
    
    scala> My.B.id
    res0: Int = 1
    
    scala> My.B.x
    res1: String = y
    
  2. ==============================

    2.사실 스칼라의 열거는 자바에 비해 훨씬 단순한 의미를 갖습니다. 당신의 목적을 위해 당신이 어떤 방식으로 열거 나 그 가치를 서브 클래스 필요가 없습니다, 당신은 단지 발 같은 컴패니언 객체에서 자신의 유형을 인스턴스화 할 필요가있다. MyEnum = MyEnum.Value 당신이 토마스 정에 의해 제공되는 예에서 가능하지 않은 자바로했다 같이이 방법 당신은 발 값의 친숙한 액세스 모델을 얻을 수 있습니다. My.MyVal = MyEnum.Value는 솔루션의 모든 hackiness 외에 나에게 보인다 좀 혼란 : 당신은 DEF 가치가있을 것이다. 여기에 내가 제안 내용의 예는 다음과 같습니다

    사실 스칼라의 열거는 자바에 비해 훨씬 단순한 의미를 갖습니다. 당신의 목적을 위해 당신이 어떤 방식으로 열거 나 그 가치를 서브 클래스 필요가 없습니다, 당신은 단지 발 같은 컴패니언 객체에서 자신의 유형을 인스턴스화 할 필요가있다. MyEnum = MyEnum.Value 당신이 토마스 정에 의해 제공되는 예에서 가능하지 않은 자바로했다 같이이 방법 당신은 발 값의 친숙한 액세스 모델을 얻을 수 있습니다. My.MyVal = MyEnum.Value는 솔루션의 모든 hackiness 외에 나에게 보인다 좀 혼란 : 당신은 DEF 가치가있을 것이다. 여기에 내가 제안 내용의 예는 다음과 같습니다

    class MyEnum(myParam:String)
    
    object MyEnum {
      val Value1 = new MyEnum("any parameters you want")
      val Value2 = new MyEnum("")
      object Value3 extends MyEnum("A different approach to instantialization which also lets you extend the type in place")
    }
    

    스칼라 모범 사례 : 열거 대 형질 상속 여기에서는 좀 더 복잡한 예제를 찾을 수 있습니다

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

    3.여기에 또 다른 간단한 방법은 다음과 같습니다

    여기에 또 다른 간단한 방법은 다음과 같습니다

    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    object Colors extends Enumeration {
      sealed case class Color private[Colors](hexCode: String, name: String) extends Val(name)
    
      val Black = Color("#000000", "black")
      val White = Color("#FFFFFF", "white")
    }
    
    // Exiting paste mode, now interpreting.
    
    defined object Colors
    
    scala> Colors.Black.hexCode
    res0: String = #000000
    
    scala> Colors.Black.name
    res1: String = black
    
    scala> Colors.values
    res2: Colors.ValueSet = Colors.ValueSet(black, white)
    
    scala> 
    
  4. ==============================

    4.나는 Enumeration.Val 클래스를 확장하여 그 일을 선호하는 것이다.

    나는 Enumeration.Val 클래스를 확장하여 그 일을 선호하는 것이다.

    귀하의 요구 사항을 위해, 나는 샘플을 아래에 게시 할 것입니다 :

    object FileType extends Enumeration {
      val csv = Val(1,"csv", ",")
      val tsv = Val(2,"tsv", "\t")
      protected case class Val(num: Int, fileType: String, delimiter: String) extends super.Val
      implicit def valueToFileType(x: Value): Val = x.asInstanceOf[Val]
    }
    

    값에 액세스하는 것은 다음과 같다 :

    scala> FileType.csv
    res0: FileType.Val = csv
    
    scala> FileType.csv.delimiter
    res29: String = ,
    
  5. from https://stackoverflow.com/questions/2507273/overriding-scala-enumeration-value by cc-by-sa and MIT license