Sub*_*rya 0 scala pattern-matching
在下面的第一个代码片段中,case语句在函数内定义,它按预期工作.
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分
下面的情况不在函数内,但在上面非常类似.它给出了一个错误.我理解错误,但我不明白为什么我在下面收到错误而不是上面的错误.
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"
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)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |