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
这种分配是合法的,因为有从隐式转换String到Seq[Char].我再次强调,这不是演员.强制转换是一种任意断言,可能在运行时失败.隐式转换无法失败.
依赖于类型之间的隐式转换以及原始问题的答案的问题是,只有在原始值不进行类型检查时才会发生隐式转换.由于在String上匹配是完全合法的,因此不会发生转换,匹配失败.
and*_*dri 11
不是100%肯定这是否正确,但我的直觉说没有这个明确的演员你会模式匹配java.lang.String,这不是你想要的.
显式强制Predef.stringWrapper转换强制Scala编译器使用隐式转换; 因此,随着RichString的扩展Seq[Char],您可以进行模式匹配,就像字符串是一系列字符一样.
我要回应andri所说的一切.对于互操作性,Scala字符串是java.lang.Strings.在Predef,有一个隐含的转换,String来RichString实现Seq[Char].
编码模式匹配的一种更好的方法,不需要中间值z来保存Seq[Char]:
def containsScala(x: String): Boolean = {
(x: Seq[Char]) match {
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8005 次 |
| 最近记录: |