【问题标题】:variable binding to pattern in case clause in scala match expressionscala匹配表达式中case子句中的变量绑定到模式
【发布时间】:2015-06-27 14:23:48
【问题描述】:

我创建了一个对象来演示案例类的用法:

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));
} 

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

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

现在我改变以下

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

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

代码编译运行成功。

现在我改变了

case str : String => s"you gave me a String ${str}";

case str @ String => s"you gave me a String ${str}";

它给了我一个错误:

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

同样的情况

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

case list @ List(1,_*) // run successfully

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

谢谢

【问题讨论】:

    标签: scala case-class


    【解决方案1】:

    冒号用于匹配类型@ 用于通过右侧事物的unapply 方法执行递归模式匹配。 p>

    在您的示例中,String 是一种类型,但 Person(x,y)List(1,_*) 不是。

    【讨论】:

    • :我是 Scala 新手,所以如果您能提供更多详细信息,这将有助于我更清楚地理解它
    • 在添加第二行后水晶清晰,因为 :String 是一种类型,但 Person(x,y) 和 List(1,_*)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2010-12-06
    相关资源
    最近更新 更多