scala:将match语句转换为模式匹配匿名函数 - 使用值

Dan*_*nke 21 scala pattern-matching

类似的问题:使用foreach时将match语句转换为partial函数.现在同样,IntelliJ要求我改进我的代码.不同的是,我使用匹配的值:

val matchMe = "Foo"
keys.foreach(key =>
  key match {
    case `matchMe` => somethingSpecial()
    case _ => somethingNormal(key, calcWith(key))
  })
Run Code Online (Sandbox Code Playgroud)

将此重构为匿名模式匹配函数将类似于:

keys.foreach {
  case `matchMe` => somethingSpecial(_)
  case _ => somethingNormal(_, calcWith(_)) //this doesn't work
}
Run Code Online (Sandbox Code Playgroud)

请注意,在第二种情况下,我不能使用,_因为我需要它两次.有没有办法在这里使用匿名模式匹配功能?

Mar*_*rth 30

你不能在_这里使用通配符,它的目的是表明你不关心你匹配的值.

您可以使用命名参数:

keys.foreach {
  case `matchMe` => somethingSpecial(matchMe)
  case nonSpecialKey => somethingNormal(nonSpecialKey, calcWith(nonSpecialKey))
}
Run Code Online (Sandbox Code Playgroud)

没有任何限制,它将匹配任何值.请注意,cases 的顺序很重要,因为case x => ...匹配任何内容并且基本上会使其他case语句快捷.


顺便说一句,我认为你somethingSpecial(_)没有做你想要/期望的事情.它只是一个简短的版本x => somethingSpecial(x),而不是somethingSpecial(matchMe).