了解分部函数中的'case'关键字



我是 Scala 的新手,我正在尝试解码它的构造,我学习了模式匹配,语法类似于 Java switch 语句

val x: Int = Random.nextInt(10)
x match {
case 0 => "zero"
case 1 => "one"
case 2 => "two"
case _ => "other"
}

这里的代码非常明显且可读。我遇到了部分函数,这些功能非常明显且清楚它们是什么

偏函数是不提供答案的函数 可以给出每个可能的输入值。

我感到困惑的是case在部分函数的主体中使用 喜欢这个:

val divide2: PartialFunction[Int, Int] = {
case d: Int if d != 0 => 42 / d // WHAT IS THIS ?! 
}

我不明白在没有match语句的情况下如何使用case,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: ?

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

这意味着仅当输入参数可以匹配大小写表达式时,才会应用部分函数。

生成的实际类如下所示:

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
}

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

参考: https://www.james-willett.com/scala-anonymous-classes

它是一个规范中描述的模式匹配匿名函数。

尝试此操作会产生错误

val SomeFun = ...

这是因为需要知道参数类型,就像"普通"匿名函数x => ...一样。不同之处在于,在模式匹配匿名函数中,没有地方可以直接指定参数类型(相当于(x: Int) => ...(,因此必须有一个预期的类型,例如val SomeFun: PartialFunction[Int, Int]val SomeFun: Int => Int.

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: PartialFunction[Int, Int] = new PartialFunction[Int, Int] {
override def apply(x: Int) = x match {
case d: Int if d != 0 => 1000 / d
case f: Int if f != 2 => 100 / f
case m: Int if m != 1 => 10 / m
}
override def isDefined(x: Int) = x match {
case d: Int if d != 0 => true
case f: Int if f != 2 => true
case m: Int if m != 1 => true
case _ => false
}
}

我将尝试回答这个问题:

我不明白在没有匹配语句的情况下如何使用大小写,如何 这是由 Scala 解释的,它是如何读取的,它是一个方法,一个类 还是其他结构?

主要是通过参考我将引用和解释的这篇文章。

这样做的原因:

val f: (Any) => String = {
case i: Int => "Int"
case d: Double => "Double"
case _ => "Other"
}

是编译器将其解释为匿名函数。

当你创建val函数时,你真正用这样的代码做的就是为匿名函数分配一个变量名。

为了支持第一个陈述,Scala 编程的第 15.7 节指出:

大括号中的一系列大小写可以在任何可以使用函数文本的地方使用。

因此,它与在filtercollect内部使用相同的语法并没有真正的区别。

上面的代码实质上创建了一个Function1对象。正如该消息来源所解释的那样:

PartialFunction 和 scala 之间的主要区别。函数 1 是 部分函数的用户可以选择做某事 与声明在其域之外的输入不同。

相关内容

  • 没有找到相关文章

最新更新