7

我刚刚开始使用 Scala 进行看似陡峭的学习曲线,并且不能完全掌握“案例”在部分函数中的工作原理。

我查看了 PartialFunction 本身的定义,我看到了如下示例:

val isEven: PartialFunction[Int, String] = { 
   case x if x % 2 == 0 => x+" is even" 
}

我卡住的部分是case x if x%2 - Scala 怎么知道这里是什么?这个“案例”陈述/关键字的正式定义是什么?

我认为我感到困惑的一个原因是因为在 Lift 中我看到了以下内容(在 Actor 类中):

override def messageHandler = {
   case SomeKindOfUserMessageClass(id1, param1) => ....
   case AnotherKindOfUserMessageClass(id2) => ....
}

我有点直观地理解这里发生了什么,但我无法对应该如何使用“案例”进行某种统一的定义。更让我困惑的是 Scala 编译器是如何解开这一切的。

4

4 回答 4

7

您要问的事情称为模式匹配。模式匹配块可以与match关键字一起使用,也可以用于定义函数或部分函数,​​具体取决于上下文。

您的第二个示例使用提取器。Scala 的评估m match { case A(x) => }涉及调用A.unapply(m). 案例类的伴生对象是一个提取器(使用案例类比实际编写方法更常见unapply)。

Scala 语言规范是一本很难读的书,但有时值得一试,特别是如果您正在寻找形式主义。第 8 章是关于模式匹配的。第 8.4 节介绍了if在第一个示例中使用 case 子句的想法。

于 2013-11-24T07:01:52.650 回答
7

在http://www.artima.com/pins1ed/case-classes-and-pattern-matching.html页面的“案例序列作为部分函数”部分下,我遇到了以下句子,我认为这可能也是一个好也回答“应该如何使用'case'”。

A sequence of cases (i.e., alternatives) in curly braces can be used anywhere a function literal can be used. Essentially, a case sequence is a function literal, only more general.一个案例序列没有一个入口点和参数列表,而是有多个入口点,每个入口点都有自己的参数列表。Each case is an entry point to the function, and the parameters are specified with the pattern. The body of each entry point is the right-hand side of the case.

于 2014-06-14T06:13:14.917 回答
1

想像case匹配某些条件或更具体的某些模式。您可以通过多种方式指定模式。

case SomeKindOfUserMessageClass(id1, param1):这表示该值应该是类型SomeKindOfUserMessageClass,如果是,则将值破坏为id1and param1。所以它就像一个带有模式匹配的条件。

case x if x % 2 == 0:这表示条件是该值应可被 2 整除,如果是,则将值绑定到xOR,您可以说,将值绑定到x并检查它是否可被 2 整除。

于 2013-11-24T06:14:33.643 回答
0

把它想象成其他语言中的 switch 语句。

在 PHP 中,您会在每个选项之前使用单词大小写。在 ruby​​ 中,你会使用“when”这个词......在其他语言中也类似。

它从上到下运行并运行匹配的第一个模式的代码。您可以根据值、类型、构造函数等进行匹配……它只运行一个代码块……并从上到下检查。

它可以在语法中...

val x = List(1,2,3,4)
x match {
  case Nil => Nil
  case x => x map someFunction
}

或者您也可以在 lambda 表达式中使用模式匹配。

在 coursera.org 上查看 scala 中的课程函数式编程原理。如果你接受了,你会在 scala 中有一个很好的头蛋挞。

于 2013-11-24T09:25:36.227 回答