Scala 将字符串匹配为Seq[Char]的模式
在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 @ _*) =>
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]
一种更好的模式匹配编码方法,不需要中间valz
来保存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正在与它们一起游动)只是没有任何类型稳健性的损失,这意味着一些特定的东西,在这里不受影响。