Scala匹配表达式中case子句的模式绑定变量

opt*_*nal 2 scala case-class

我创建了一个对象,用于说明案例类的用法:

object MatchWithPattern extends App
{
    case class Person(firstName:String,lastName:String);
    def whatYouGaveMe(obj:Any):String={
                obj match {
                case str : String => s"you gave me a String ${str}";
                case person : Person(firstName,lastName) => s" You gave me a Person Object with ${person.firstName} ${person.lastName}";
                case default => "You gave me a Any class Object";
                }

        }

    var person= new Person("Mukesh", "Saini");
    Console.println(whatYouGaveMe(person));
} 
Run Code Online (Sandbox Code Playgroud)

并且代码无法编译并给出错误

错误:预期为“ =>”,但找到了“(”

现在我改变以下

case person : Person(firstName,lastName) => s" You gave me a Person Object with ${person.firstName} ${person.lastName}";
Run Code Online (Sandbox Code Playgroud)

case person @ Person(firstName,lastName) => s" You gave me a Person Object with ${person.firstName} ${person.lastName}";
Run Code Online (Sandbox Code Playgroud)

代码编译并成功运行。

现在我改变

case str : String => s"you gave me a String ${str}";
Run Code Online (Sandbox Code Playgroud)

case str @ String => s"you gave me a String ${str}";
Run Code Online (Sandbox Code Playgroud)

它给了我一个错误:

错误:对象java.lang.String不是值

同样的情况适用于

case list : List(1,_*) // gives error

case list @ List(1,_*) // run successfully
Run Code Online (Sandbox Code Playgroud)

所以我的问题是我应该在哪里使用@而不是

谢谢

dhg*_*dhg 5

冒号用于与type进行匹配,@用来通过unapply右侧事物的方法执行递归模式匹配。

在你的例子,String是一个类型,但Person(x,y)List(1,_*)没有。