以下是我對語言的理解。如何在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