列出与其类型匹配的元素

发布于 2024-11-14 12:08:35 字数 791 浏览 3 评论 0原文

我有一个类似于下面的代码:

def walkTree(list:List[Command]) {
    list match {
        case Command1::rest => doSomething(); walkTree(rest)
        case Command2::rest => doSomethingElse(); walkTree(rest)
        case Nil => ;
    }
}

我还知道您可以对特定类型进行模式匹配并同时分配一个变量:

try {
    ...
}
catch {
    case ioExc:IOException => ioExc.printStackTrace()
    case exc:Exception => throw new RuntimeException("Oh Noes", e);
}

有没有一种方法可以将两者结合起来,如下所示:

def walkTree(list:List[Command]) {
    list match {
        case cmd1:Command1::rest => doSomething(); walkTree(rest)
        case cmd2:Command2::rest => doSomethingElse(); walkTree(rest)
        case Nil => ;
    }
}

或者我需要提取每个匹配之前列出元素?

I've got a code similar to one below:

def walkTree(list:List[Command]) {
    list match {
        case Command1::rest => doSomething(); walkTree(rest)
        case Command2::rest => doSomethingElse(); walkTree(rest)
        case Nil => ;
    }
}

I also know that you can pattern match on specific type and assign a variable at the same time:

try {
    ...
}
catch {
    case ioExc:IOException => ioExc.printStackTrace()
    case exc:Exception => throw new RuntimeException("Oh Noes", e);
}

Is there a way to combine both in something like below:

def walkTree(list:List[Command]) {
    list match {
        case cmd1:Command1::rest => doSomething(); walkTree(rest)
        case cmd2:Command2::rest => doSomethingElse(); walkTree(rest)
        case Nil => ;
    }
}

Or do I need to extract each list element before matching?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉薄对峙 2024-11-21 12:08:35

是的,只需使用这样的括号(参见下面的示例):

def walkTree(list:List[Command]) {
    list match {
        case (cmd1:Command1)::rest => doSomething(); walkTree(rest)
        case (cmd2:Command2)::rest => doSomethingElse(); walkTree(rest)
        case Nil => ;
    }
}

但是,您不能使用 foreach 来实现此目的:

scala> List(A(1), B(2), A(3), B(4), A(5)).foreach(_ match {
     |     case (a:A) => println("a:" + a)
     |     case (b:B) => println("b:" + b)
     | })
a:A(1)
b:B(2)
a:A(3)
b:B(4)
a:A(5)

示例:

scala> case class A(val i: Int);
defined class A

scala> case class B(val i: Int);
defined class B

scala> def walkTree(list: List[ScalaObject]) {
     |     list match {
     |         case (a:A)::rest => println("a:" + a); walkTree(rest);
     |         case (b:B)::rest => println("b:" + b); walkTree(rest);
     |         case Nil => ;
     |     }
     | }
walkTree: (list: List[ScalaObject])Unit

scala> walkTree(List(A(1), B(2), A(3), B(4), A(5)))
a:A(1)
b:B(2)
a:A(3)
b:B(4)
a:A(5)

Yes, just use parentheses like this (see example below):

def walkTree(list:List[Command]) {
    list match {
        case (cmd1:Command1)::rest => doSomething(); walkTree(rest)
        case (cmd2:Command2)::rest => doSomethingElse(); walkTree(rest)
        case Nil => ;
    }
}

However, can't you use foreach for this:

scala> List(A(1), B(2), A(3), B(4), A(5)).foreach(_ match {
     |     case (a:A) => println("a:" + a)
     |     case (b:B) => println("b:" + b)
     | })
a:A(1)
b:B(2)
a:A(3)
b:B(4)
a:A(5)

Example:

scala> case class A(val i: Int);
defined class A

scala> case class B(val i: Int);
defined class B

scala> def walkTree(list: List[ScalaObject]) {
     |     list match {
     |         case (a:A)::rest => println("a:" + a); walkTree(rest);
     |         case (b:B)::rest => println("b:" + b); walkTree(rest);
     |         case Nil => ;
     |     }
     | }
walkTree: (list: List[ScalaObject])Unit

scala> walkTree(List(A(1), B(2), A(3), B(4), A(5)))
a:A(1)
b:B(2)
a:A(3)
b:B(4)
a:A(5)
只为一人 2024-11-21 12:08:35

使用 foreach 然后对每个元素进行模式匹配对我来说似乎更清晰:

def walkTree(list:List[Command]) {
  list foreach {
    _ match {
      case cmd1:Command1 => doSomething()
      case cmd2:Command2 => doSomethingElse()
      case _ =>
    }
  }
}

Using foreach and then pattern match on each element seems to be clearer for me:

def walkTree(list:List[Command]) {
  list foreach {
    _ match {
      case cmd1:Command1 => doSomething()
      case cmd2:Command2 => doSomethingElse()
      case _ =>
    }
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文