Scala: How can I match only the first two elements

2019-06-12 16:18发布

I'm attempting to match a lists first two elements, however, it wont accept lists of arbitrary length. The below code fails.

  def demoCases() = {
    def actor1 = new Actor[Employee] {}
    def actor2 = new Actor[Employee] {}
    def actor3 = new Actor[Animal] {}

    var actors = List(actor1, actor2, actor3);
    println();
    actors match {
      case (_: Employee) :: (_: Employee) :: tail
        => {println("nice 2  employees to start with ")};

      case Nil
        => {println("no match")}
    }

The exception :

Exception in thread "main" scala.MatchError: List(.....)

How can i specify that only the two elements first of the list need to match this expression?

2条回答
Lonely孤独者°
2楼-- · 2019-06-12 16:59

The following does not work thanks to type-erasure (pointed out by Alexey Romanov)

case (_: Actor[Employee]) :: (_: Actor[Employee]) :: tail

Therefore I cannot think of any way to do what you want without restructuring the code. For example if you made Employee a member of Actor somehow, and made Actor a case class, you could do

case Actor(_: Employee) :: Actor(_: Employee) :: tail
查看更多
Melony?
3楼-- · 2019-06-12 17:05

Just replace case Nil by case _ => println("no match"). _ as a pattern means "match anything". But note that your first case requires that the first two elements of the list are Employees, not Actors.

查看更多
登录 后发表回答