以下是我对语言的理解。如何在Scala中声明新的部分函数类型
如何声明新的特定部分函数类型。比方说,我需要声明许多部分定义的函数,取一个MyClass类并返回一个字符串。如果我尝试:
class mypf extends PartialFunction[MyClass, String]
val myinstance: mypf = { case ... }
斯卡拉抱怨mypf应该是抽象的。我会怎么做?完全这样做不是个好主意吗?如果是这样,为什么?
以下是我对语言的理解。如何在Scala中声明新的部分函数类型
如何声明新的特定部分函数类型。比方说,我需要声明许多部分定义的函数,取一个MyClass类并返回一个字符串。如果我尝试:
class mypf extends PartialFunction[MyClass, String]
val myinstance: mypf = { case ... }
斯卡拉抱怨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的,字符串]的别名,你应该做的
type MyPf = PartialFunction[MyClass, String]
该声明不可能在顶层,它必须在一个对象内。如果你想让它看起来非常像顶层声明,那么你可以在包对象中声明类型。
要走远一点,做
abstract class mypf extends PartialFunction[MyClass, String]
是合法的(它显然必须是抽象的,它缺乏对应用的实施和被定义)。但是,诸如{case x => ...}
之类的表达式将属于PartialFunction类型,而不是您的类型,因此您的类型将不方便。
即使没有丢失litterals,使用继承只是为了得到一个别名是有限的使用。如果您执行class MyClass extends Something<With, Lots, Of, Parameters>
,则MyClass
将在您创建实例时提供帮助,但是声明MyClass
类型的方法参数可防止过度限制该方法。
A PartialFunction
不必为整个输入域定义,因此该特征将apply
和isDefinedAt
定义为抽象。 因此,你必须实现上述方法,像这样:
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
明确,但它有时是非常有用这样做。
谢谢。我忽略了“类型”关键字这就是问题所在。 – eje211 2012-03-02 17:32:16