如何使用模式匹配案例类中声明的变量?

时间:2018-02-05 12:14:06

标签: scala pattern-matching

我有以下特点:

sealed trait Tr

case class Test1(str: String) extends Tr

现在我想在我的代码中使用str

val tr: Tr = //...

tr match {
    case Test1(str) =>
        val str = //str declared in Test1(str) + "some another string"
}

是否可以直接引用保留名称str的{​​{1}}。我可以使用像

这样的东西
str

但这对我来说似乎很难看。

4 个答案:

答案 0 :(得分:1)

str是不可变的。尝试另一个变量。

如果您想编辑案例类,请尝试:

val test2 = test1.copy(str = test1.str + "some another string")

这将创建一个新实例,而不是改变case class

答案 1 :(得分:1)

您不需要电子邮件运营商:

sealed trait Tr
case class Test1(str: String) extends Tr
val tr = Test1 ("foo")
tr match {
   case Test1 (str) => println (str) 
}
foo

当然,不能重新分配给str。

注意,在大多数情况下,类的参数具有含义,并且在理想世界中,几个最佳含义之一,因此重复相同变量名称的刺激是高的。但总的来说,你不必再次使用str。也许新的上下文提供了更好的名称:

tr match {
   case Test1 (bar) => println (bar) 
}

参数名称,无论是'str'还是'bar'用于解析对Test1的Ctor调用,并且绑定适合新名称的名称。

请注意,在您的示例中:

tr match {
    case test1 @ Test1(str) =>
        str = test1.str + "some another string"
}

如果您碰巧需要引用整个事物,名称tr在范围内,您可以参考它:

tr match {
    case Test1 (str) => dedodulute (tr)
}

您没有义务在右侧使用str

有时您甚至想在case语句的左侧引用case类的参数:

tr match {
      case Test1 (s) if (s.startsWith ("f"))  => println ("foo") 
      case Test1 (s) if (s.startsWith ("b"))  => println ("bar") 
      case _ => println ("unknown") 
}

您甚至可以从列表中选择一个元素,但必须从左侧知道它的位置:

val l = List (4, 1, 3, 9) 
l match {
      case List (_, a, _*) => println ("2nd el is " + a) 
      case _ => println ("unknown") 
}

你不能使用

case List (_*, a, _) => println ("2nd last el is " + a) 

但你可以使用文字值来收紧你的比赛:

l match {
    case List (3, a, _*) => println ("2nd el is " + a + "after 3") 
    case List (4, a, _*) => println ("2nd el is " + a + "after 4") 
    case _ => println ("unknown") 
 }

答案 2 :(得分:1)

You can do something like this:

sealed trait Tr

case class Test1(str: String) extends Tr

val tem = Test1 ("I am immutable!!")
val str = tem match {
case Test1 (str) => str + "But you can assign me to something else :)."
}

println(str)

答案 3 :(得分:1)

你的最后一个案例看起来几乎是你需要的:

tr match {
  case test1: Test1 =>
    val str = test1.str + "some another string"
}