繁体   English   中英

如何在Scala中声明新的部分函数类型

[英]How to declare a new partial function type in Scala

以下是我对语言的理解。

如何声明新的特定部分函数类型。 假设我需要声明许多部分定义的函数,接受一个MyClass类并返回一个字符串。 如果我尝试:

class mypf extends PartialFunction[MyClass, String]
val myinstance: mypf = { case ... }

Scala抱怨mypf应该是抽象的。 我该怎么办? 完全这样做是不是一个坏主意? 如果是这样,为什么?

虽然它一般不能解决您的问题,但在特定情况下可能有所帮助:

scala> type mypf = PartialFunction[Int, String]
defined type alias mypf

// type alias for PartialFunction

scala> val x: mypf = {case x: Int if x > 10 => "More than ten"}
x: mypf = <function1>

如果你想要的只是拥有PartialFuncion [MyClass,String]的别名,你应该这样做

type MyPf = PartialFunction[MyClass, String]

这个声明在顶级是不可能的,它必须在一个对象内。 如果您希望它看起来非常像顶级声明,那么您可以在包对象中声明类型。

做得更远,做

abstract class mypf extends PartialFunction[MyClass, String] 

是合法的(它显然必须是抽象的,它缺乏应用的实现,并且是定义的)。 但是,诸如{case x => ...}之类的表达式将是PartialFunction类型,而不是您的类型,因此您的类型将不方便。

即使没有失去lteterals,使用继承只是为了获得别名是有限的用途。 如果你的class MyClass extends Something<With, Lots, Of, Parameters>MyClass将在你创建实例时提供帮助,但是声明MyClass类型的方法参数可以防止过度限制方法。

PartialFunction不具有用于整个输入域被定义,因此,该性状定义了applyisDefinedAt作为抽象。 因此你必须像这样实现上述方法:

val myInstance = new PartialFunction[Int, String] {
  override def apply(i: Int): String = {
    if (i < 100)
      "Valid " + i
    else
      "Undefined"
  }

  override def isDefinedAt(i: Int): Boolean = i < 100
}

您不需要明确说明override ,但有时这样做很有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM