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

Joh*_*ler 10 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
   }
 }
Run Code Online (Sandbox Code Playgroud)

}

我遇到的问题是代码片段的第三行:

val z: Seq[Char] = x
Run Code Online (Sandbox Code Playgroud)

为什么这种演员必要?字符串在所有情况下都不应该像Seq [Char]一样(包括模式匹配)?但是,如果没有此转换,代码段将无法使用.

psp*_*psp 18

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

scala演员看起来像这样:x.asInstanceOf[Y].
你在上面看到的是一项任务:val z: Seq[Char] = x

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

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

  • 对不起,你是对的有种类的让步(事实上scala和他们一起游泳)并不是说有任何类型的健全性损失,这意味着特定的东西并且不会受到影响. (2认同)

and*_*dri 11

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

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

  • 没有类型的健全性丢失.隐式转换只是编译器插入一个函数调用,类似于val z:Seq [Char] = string2Seq(x) (2认同)

Jor*_*tiz 7

我要回应andri所说的一切.对于互操作性,Scala字符串是java.lang.Strings.在Predef,有一个隐含的转换,StringRichString实现Seq[Char].

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

def containsScala(x: String): Boolean = {
  (x: Seq[Char]) match {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)