我在教自己斯卡拉,我有一个哲学问题。模式匹配Scala的语言功能,还是仅仅是库功能?换句话说,我是否有足够的技巧,可以写xmatch
,除了名字以外,每个方面都有match
相同的功能?实际上,我认为这些是两个略有不同的问题:匹配库功能,可以它是一个库功能吗?
我正在考虑重新编写匹配,纯粹是作为一种练习,但我希望有一些保证它是可能的。
答案 0 :(得分:5)
模式匹配是一种语言特性,match
语句只是最值得注意的例子。以下是另外两个常用的例子:
val List(x,y,(z: Int,w: Int)) = List("one","two",(3,4))
for ((text,i) <- List(("one",1),("two",2))) println(text + " = " + i)
所以,不,你不能自己做。该语言不允许您定义创建变量的新方法,因此这些事情只能在语言支持下发生。
match
语句本身使用语言中的模式匹配变量创建支持,但原则上可以实现为库功能。但是,在某些情况下效率会很低:
// This is implemented with fast jumps, not slow if-then-else!
n match {
case 0 => // Do action 0
case 1 => // Do action 1
case 2 => // Do action 2
case _ => // Do default action
}
// This is tail recursive, so you won't overflow the stack!
def recursiveMatch(xs: List[Any]): List[Any] = xs match {
case (x @ Int) :: rest => recursiveMatch(rest)
case _ => xs
}
所以,总而言之,不,你不能自己编写模式匹配,虽然你可以编写匹配语句,但使用现有模式有优势。
答案 1 :(得分:4)
实际上,我已经听说过match
曾经在图书馆实施过。 Scala参考中的更改日志表明match
在2.0版本上成为保留关键字,此时object.match { ... }
也不再是有效语法。
原则上很容易实现它:
implicit def toMyMatch[T](obj: T) = new {
def myMatch[R](f: T => R) = f(obj)
}
我不知道为什么它不再以这种方式实施的确切原因。
答案 2 :(得分:2)
模式匹配绝对是一种语言功能。也就是说,因为在Scala中编写控件流结构非常简单(并且模式匹配很强大),所以您可以轻松编写自己的match
(与其他语言相比)。
match
仍然是语言核心的一部分(我认为),但它的行为更像是库中的东西。由于模式匹配的强大程度,它感觉非常有机。
那就是说,是的,你绝对可以重写match
。