我有以下特点:
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
但这对我来说似乎很难看。
答案 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"
}