Scala 匹配是语言特性吗?

Scala 匹配是语言特性吗?,scala,pattern-matching,Scala,Pattern Matching,我在自学Scala,我有一个哲学问题。模式匹配是Scala的语言特性,还是仅仅是库特性?换句话说,如果我足够熟练,我是否可以编写xmatch,这是一个除了名称之外在所有方面都与match相同的函数?实际上,我认为这是两个稍有不同的问题:匹配是一个库特性吗?它可能是一个库特性吗 我想尝试重新编写match,这纯粹是一种练习,但我希望能够得到一些保证。模式匹配绝对是一种语言特性。这就是说,因为在Scala中编写控制流结构非常容易(而且模式匹配非常健壮),所以您可以轻松地编写自己的match(与其他语

我在自学Scala,我有一个哲学问题。模式匹配是Scala的语言特性,还是仅仅是库特性?换句话说,如果我足够熟练,我是否可以编写
xmatch
,这是一个除了名称之外在所有方面都与
match
相同的函数?实际上,我认为这是两个稍有不同的问题:匹配是一个库特性吗?它可能是一个库特性吗


我想尝试重新编写match,这纯粹是一种练习,但我希望能够得到一些保证。

模式匹配绝对是一种语言特性。这就是说,因为在Scala中编写控制流结构非常容易(而且模式匹配非常健壮),所以您可以轻松地编写自己的
match
(与其他语言相比)

另一方面,match仍然是语言核心的一部分(我认为),但它的行为更像是库中的某个东西。它感觉如此有机,因为模式匹配是多么强大


也就是说,是的,你完全可以重写
match

事实上,
match
我听说以前是在库中实现的。Scala参考中的更改日志表明
match
在版本2.0上成为保留关键字,此时
object.match{…}
也不再是有效语法

原则上很容易实施:

implicit def toMyMatch[T](obj: T) = new {
    def myMatch[R](f: T => R) = f(obj)
}

我不知道它停止以这种方式实现的确切原因。

模式匹配是一种语言特性,其中
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
作为一种方法会阻止对分部函数内部的尾部调用进行尾部调用优化。这如何允许进行案例分析?@pelotom
f
必须是一个分部函数。我会将上面的代码片段更改为类似于
def myMatch[R](f:PartialFunction[T,R])=f(obj)
ok,这样您就可以将
match
实现为一个库,而不是
case
,这才是真正神奇的地方,在这个答案中似乎没有真正的答案。都是些含糊其辞的话和赞美。。。
// 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
}