scala中的模式匹配在def内部工作,否则不起作用

Sub*_*rya 0 scala pattern-matching

在下面的第一个代码片段中,case语句在函数内定义,它按预期工作.

代码段1

def echoWhatYouGaveMe(x: Any): String = x match {

    case (a, b) => s"got $a and $b"
    case (a, b, c) => s"got $a, $b, and $c"
    case _ => "Unknown"
}

object MatchTest extends App {

    // trigger the tuple patterns
    println(echoWhatYouGaveMe((1,2)))         // two element tuple
    println(echoWhatYouGaveMe((1,2,3)))       // three element tuple

}

MatchTest.main(Array("dummy"))
Run Code Online (Sandbox Code Playgroud)

产量

有1和2

得到1分,2分和3分

下面的情况不在函数内,但在上面非常类似.它给出了一个错误.我理解错误,但我不明白为什么我在下面收到错误而不是上面的错误.

代码片段2

val myTuple = (1, 2, 3)

val toPrint = myTuple match {
  case (a, b, c) => s"got $a, $b, and $c"
  case (a, b) => s"got $a and $b"
  case _ => s"Unknown data"
}
Run Code Online (Sandbox Code Playgroud)

产量

:14:错误:构造函数无法实例化为期望的类型; 发现:(T1,T2)必需:(Int,Int,Int)case(a,b)=> s"得到$ a和$ b"

Cha*_*kar 8

scala模式匹配的这种行为的原因在于类型系统.Scala具有非常强大的类型系统,允许高类型安全性并在编译时捕获错误本身.如果声明一个具有参数而不是Any的函数,它也会抛出相同的错误.

例如: -

def echoWhatYouGaveMe(x: (Int, Int)): String = x match {

  case (a, b) => s"got $a and $b"
  case (a, b, c) => s"got $a, $b, and $c"
  case _ => "Unknown"
}

echoWhatYouGaveMe((1,2))
Run Code Online (Sandbox Code Playgroud)

你得到一个错误说明

Error:(4, 9) constructor cannot be instantiated to expected type;
 found   : (T1, T2, T3)
 required: (Int, Int)
  case (a, b, c) => s"got $a, $b, and $c"
       ^
Run Code Online (Sandbox Code Playgroud)

如果修改val myTuple并将其类型显式设置为Any,它将允许您执行模式匹配.

val myTuple: Any = (1, 2, 3)

val toPrint = myTuple match {
  case (a, b, c) => s"got $a, $b, and $c"
  case (a, b) => s"got $a and $b"
  case _ => s"Unknown data"
}
Run Code Online (Sandbox Code Playgroud)

你得到这样的输出

myTuple: Any = (1,2,3)

toPrint: String = got 1, 2, and 3
Run Code Online (Sandbox Code Playgroud)