匹配字符串的模式为Seq [Char]

时间:2009-04-11 18:15:28

标签: scala pattern-matching

在Scala中,可以通过将其视为Seq [Char]来基于字符串的invididual字符来制定模式。

A Tour of Scala

中提到了此功能的一个示例

这是在那里使用的示例代码:

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]一样(包括模式匹配)?但是,如果没有此转换,代码段将无效。

3 个答案:

答案 0 :(得分:18)

在问题和评论中有一些真正滥用的术语。此代码中没有强制转换,特别是“基本上,这是对Java互操作性的一个主要让步,牺牲一些类型的健全性”在现实中没有依据。

scala演员如下:x.asInstanceOf[Y] 您在上面看到的是作业:val z: Seq[Char] = x

此分配是合法的,因为存在从StringSeq[Char]的隐式转换。我再次强调,这不是演员。强制转换是一种任意断言,可能在运行时失败。隐式转换无法失败。

依赖于类型之间的隐式转换以及原始问题的答案的问题是,只有在原始值不进行类型检查时才会发生隐式转换。由于匹配字符串是完全合法的,因此不会发生转换,匹配失败。

答案 1 :(得分:11)

不是100%确定这是否正确,但我的直觉说如果没有这个明确的演员,你会模仿与java.lang.String的匹配,这不是你想要的。

显式强制转换强制Scala编译器使用Predef.stringWrapper隐式转换;因此,当RichString扩展Seq[Char]时,您可以进行模式匹配,就像字符串是一系列字符一样。

答案 2 :(得分:7)

我要回应andri所说的一切。对于互操作性,Scala字符串为java.lang.String。在Predef中,存在从StringRichString的隐式转换,它实现了Seq[Char]

一种编码模式匹配的更好方法,无需中间值z来保存Seq[Char]

def containsScala(x: String): Boolean = {
  (x: Seq[Char]) match {
    ...
  }
}