scala - 理解偏函数中的 'case'关键字

标签 scala pattern-matching partialfunction

我是 Scala 的新手,我正在尝试解码它的结构,我了解了 pattern matching并且语法类似于 Java switch 语句

val x: Int = Random.nextInt(10)

x match {
  case 0 => "zero"
  case 1 => "one"
  case 2 => "two"
  case _ => "other"
}

这里的代码非常明显和可读。我遇到了partial functions很明显很清楚它们是什么

A partial function is a function that does not provide an answer for every possible input value it can be given.



我感到困惑的是使用 case在偏函数体中
像这样:
val divide2: PartialFunction[Int, Int] = {
    case d: Int if d != 0 => 42 / d // WHAT IS THIS ?! 
}

我不明白如何case在没有 match 的情况下使用语句,Scala 如何解释它,它是如何读取的,它是一个方法、一个类还是另一个构造?,我还可以使用哪些其他方式 case没有 match陈述

编辑:

我试着玩弄这个案例,但仍然不明白。例如
val SomeFun: PartialFunction[Int, Int] = {
    case d: Int if d != 0 => 1000 / d
    case f: Int if f != 2 => 100 / f
    case m: Int if m != 1 => 10 / m
  }

这是如何运作的?

尝试这个会出错
val SomeFun = {
    case d: Int if d != 0 => 1000 / d
    case f: Int if f != 2 => 100 / f
    case m: Int if m != 1 => 10 / m
  }


Error:(29, 17) missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: ?

不匹配的大小写是否在部分函数之外的其他任何地方使用?

最佳答案

这意味着只有当输入参数可以匹配 case 表达式时才会应用偏函数。

生成的实际类是这样的:

val divide = new PartialFunction[Int, Int] {
    def apply(x: Int) = 42 / x
    def isDefinedAt(x: Int) = x != 0
}

使用 orElse 您可以应用或处理多个定义:
funcForInt orElse funcForDouble orElse funcForString

构图好看?

编辑:
val SomeFun: PartialFunction[Int, Int] = {
    case d: Int if d != 0 => 1000 / d
    case f: Int if f != 2 => 100 / f
    case m: Int if m != 1 => 10 / m
  }

以上是使用匿名类功能。如果你删除变量的类型,你只是给它一个块表达式,其中包含一些编译器不能真正使用的 case 表达式。

引用:https://www.james-willett.com/scala-anonymous-classes

关于scala - 理解偏函数中的 'case'关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58406039/

相关文章:

scala - 如何在 Scala 项目中将 Play 框架作为依赖项导入

haskell - (l,r)之前的~是什么意思

java - 从匹配器获取字符串的特定部分

scala - "case"在 Scala 的部分函数中究竟是如何工作的?

arrays - Scala案例类参数从数组实例化

scala - 添加对 Scala 枚举进行操作的方法

正则表达式:从具有多个匹配项的括号中提取数字

scala - scala 的 case 保护语句中的变量范围

scala - 与下划线一起使用时,部分函数应用程序过早地运行代码块

java - scala - 将 Mahout vector 转换为数组