30086

[code]

    abstract class A
    
    case class AA(s: String) extends A
    
    abstract class AB(n: Int) extends A
    
    case class ABA(n: Int) extends AB(n)
    case class ABB(n: Int) extends AB(n)
    
    object Main extends App {
        val list: List[A] = List(AA("aa"), ABA(12), ABB(34))
        for(a <- list) {
            a match {
                case AA(s) => println("AA:" + s)
                case AB(n) => println("AB:" + n)
            }
        }
    }
    
[/code]

このようなパターンマッチを書くには、どのようなunapplyを定義すれば良いのでしょうか。


CC BY-SA 3.0
2016-11-03T17:55:45.320
30085
2016-11-03T21:13:39.577
19414
question
scala
scalaの抽象クラスのパターンマッチの方法


`abstract class
AB`が`n`というメンバーないしメソッドを持っていることを意図されているのであれば、`AB`を下記のように定義し、そのコンパニオンオブジェクト`object
AB`に`unapply`を定義すればよいかと思います。

※AとBが多く見辛かったので、`ABA`を`AB1`、`ABB`を`AB2`に変えています

[code]

    abstract class A
    
    case class AA(s: String) extends A
    
    abstract class AB extends A {
      def n: Int
    }
    object AB {
      def unapply(ab: AB): Option[Int] = Option(ab).map(_.n)
    }
    
    case class AB1(n: Int) extends AB
    case class AB2(n: Int) extends AB
    
    object Main extends App {
      for (a <- List[A](AA("aa"), AB1(12), AB2(34))) {
        a match {
          case AA(s) => println("AA:" + s)
          case AB(n) => println("AB:" + n)
        }
      }
    }
    
[/code]

abstract classである必要がなければ、traitでも構いません。

[code]

    trait A
    
    case class AA(s: String) extends A
    
    trait AB extends A {
      def n: Int
    }
    object AB {
      def unapply(ab: AB): Option[Int] = Option(ab).map(_.n)
    }
    
    case class AB1(n: Int) extends AB
    case class AB2(n: Int) extends AB
    
[/code]

* * *

英語版stackoverflowで類似する質問への回答もご参考ください。  
<https://stackoverflow.com/a/14810591/4366193>


CC BY-SA 3.0
2016-11-03T20:55:04.203
30086
2016-11-03T21:13:39.577
2017-05-23T12:38:55.250
-1
3068
30085
answer