case x:Int
和case x @ Int
之间有什么区别?在下面的示例中,为什么在case x@Int
参数传递时不匹配Int
?
scala> def matchInt (x:Any) = x match {
| case x:Int => println("got int"+x) //this matches with Int
| case _ => println("no int "+x)
| }
matchInt: (x: Any)Unit
scala> matchInt(1)
got int1
scala> matchInt("2")
no int 2
scala> def matchInt (x:Any) = x match {
| case x @ Int => println("got int"+x) //this doesn't matches with Int
| case _ => println("no int "+x)
| }
matchInt: (x: Any)Unit
scala> matchInt("2")
no int 2
scala> matchInt(1)
no int 1
scala>
答案 0 :(得分:2)
jobs
表示“类型为Int的x”。 x:Int
表示“x 类型为Int”。
在这种情况下,后者非常无用。
答案 1 :(得分:1)
我们使用x: Int
进行类型模式匹配,有时您可能希望向模式添加变量。您可以使用以下常规语法执行此操作:variableName @ pattern
。
x: Int
,您的模式匹配可以匹配x的类型。对于variableName @ pattern
,请查看我们匹配各种模式的示例:
scala> case class Test(t1: String, t2: String)
defined class Test
scala> object Test2 extends App {
| def matchType(x: Any): String = x match {
| case y @ List(1, _*) => s"$y" // works; prints the list
| case y @ Some(_) => s"$y" // works, returns "Some(Hiii)"
| case y @ Test("t1", "t2") => s"$y" // works, returns "Test(t1,t2)"
| }
| }
defined object Test2
scala> Test2.matchType(List(1,2,3))
res2: String = List(1, 2, 3)
scala> Test2.matchType(Some("Hiii"))
res3: String = Some(Hiii)
scala> Test2.matchType(Test("t1","t2"))
res4: String = Test(t1,t2)