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

Scala 将字符串匹配为Seq[Char]的模式,scala,pattern-matching,Scala,Pattern Matching,在Scala中,可以通过将字符串视为Seq[Char]来基于字符串的非十进制字符来制定模式 中提到了此功能的一个示例 这是此处使用的示例代码: object RegExpTest1 extends Application { def containsScala(x: String): Boolean = { val z: Seq[Char] = x z match { case Seq('s','c','a','l','a', rest @ _*) =>

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

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

这是此处使用的示例代码:

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]吗?但是,如果没有这种转换,代码片段将无法工作。

不能100%确定这是否正确,但我的直觉告诉我,如果没有这种显式转换,您将与
java.lang.String
进行模式匹配,这不是您想要的


显式转换强制Scala编译器使用隐式转换;因此,随着扩展,您可以进行模式匹配,就像字符串是一个字符序列一样。

我将重复andri所说的一切。为了实现互操作性,Scala字符串是
java.lang.String
s。在
Predef
中,有一个从
String
RichString
的隐式转换,它实现了
Seq[Char]

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

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

问题和评论中确实存在一些滥用术语的情况。这段代码中没有强制转换,尤其是“因此,从根本上说,这是Java互操作性的一个重大让步,牺牲了一些类型的可靠性”在现实中没有依据

scala强制转换如下所示:
x.asInstanceOf[Y]

您在上面看到的是一个赋值:
valz:Seq[Char]=x

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


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

这很有道理,基本上就是我一直在猜测的。但是,我没有找到隐式转换器。谢谢你指出这一点。所以基本上,这是Java互操作性的一个重大让步,牺牲了一些类型的可靠性。隐式转换只是编译器插入一个函数调用,类似于val z:Seq[Char]=string2Seq(x)。让步是字符串不能直接从Seq[Char]继承,因为它是Java类型的typedef。对不起,您是对的,排序有让步(事实上scala正在与它们一起游动)只是没有任何类型稳健性的损失,这意味着一些特定的东西,在这里不受影响。