在Scala中,可以通过将其视为Seq [Char]来基于字符串的invididual字符来制定模式。
中提到了此功能的一个示例这是在那里使用的示例代码:
object RegExpTest1 extends Application {
def containsScala(x: String): Boolean = {
val z: Seq[Char] = x
z match {
case Seq('s','c','a','l','a', rest @ _*) =>
println("rest is "+rest)
true
case Seq(_*) =>
false
}
}
}
我遇到的问题是片段的第三行:
val z: Seq[Char] = x
为什么这种演员必要?字符串在所有情况下都不应该像Seq [Char]一样(包括模式匹配)?但是,如果没有此转换,代码段将无效。
答案 0 :(得分:18)
在问题和评论中有一些真正滥用的术语。此代码中没有强制转换,特别是“基本上,这是对Java互操作性的一个主要让步,牺牲一些类型的健全性”在现实中没有依据。
scala演员如下:x.asInstanceOf[Y]
您在上面看到的是作业:val z: Seq[Char] = x
此分配是合法的,因为存在从String
到Seq[Char]
的隐式转换。我再次强调,这不是演员。强制转换是一种任意断言,可能在运行时失败。隐式转换无法失败。
依赖于类型之间的隐式转换以及原始问题的答案的问题是,只有在原始值不进行类型检查时才会发生隐式转换。由于匹配字符串是完全合法的,因此不会发生转换,匹配失败。
答案 1 :(得分:11)
不是100%确定这是否正确,但我的直觉说如果没有这个明确的演员,你会模仿与java.lang.String
的匹配,这不是你想要的。
显式强制转换强制Scala编译器使用Predef.stringWrapper
隐式转换;因此,当RichString扩展Seq[Char]
时,您可以进行模式匹配,就像字符串是一系列字符一样。
答案 2 :(得分:7)
我要回应andri所说的一切。对于互操作性,Scala字符串为java.lang.String
。在Predef
中,存在从String
到RichString
的隐式转换,它实现了Seq[Char]
。
一种编码模式匹配的更好方法,无需中间值z
来保存Seq[Char]
:
def containsScala(x: String): Boolean = {
(x: Seq[Char]) match {
...
}
}