2015-12-05 54 views
0

更具體地說,我有:在scala中是否有類似Map.keySet的部分函數?

case class Key (key: String) 
abstract class abstr { 
    type MethodMap = PartialFunction[Key, String => Unit] 
    def myMap: MethodMap // abstract 

    def useIt (key: Key, value: String) = { 
    val meth = myMap(key) 
    meth(value) 
    } 

    def report = { 
    for (key <- myMap.keySet) // how to do this 
     println("I support "+key) 
    } 
} 

我用這樣的:

class concrete extends abstr { 
    var one: Boolean 
    def method1(v: String): Unit = ??? 
    def method2(v: String): Unit = ??? 

    def map1: MethodMap = { 
    case Key("AAA") => method1 
    } 
    def map2: MethodMap = { 
    case Key("AAA") => method2 
    } 

    override def myMap: MethodMap = if (one) map1 else map2 
} 

當然,這是有些簡化,但報告的功能是必要的。

一些歷史記錄:我首先使用Map實現它,但後來我將它改爲PartialFunction以支持以下override def myMap: MethodMap = if (one) map1 else map2

任何建議重構我的代碼來支持一切也是讚賞。

回答

3

No. PartialFunction可以在無限集上定義(並且經常)。例如。你能指望什麼report在這些情況下返回:

class concrete2 extends abstr { 
    def myMap = { case Key(_) => ??? } 
} 

class concrete2 extends abstr { 
    def myMap = { case Key(key) if key.length > 3 => ??? } 
} 

?如果你有你有興趣值的有限列表,你可以做

abstract class abstr { 
    type MethodMap = PartialFunction[Key, String => Unit] 
    def myMap: MethodMap // abstract 
    val keys: Seq[Key] = ... 

    def report = { 
    for (key <- keys if myMap.isDefined(key)) 
     println("I support "+key) 
    } 
} 

一些歷史:我首先它實現使用地圖,但後來我爲了支持最後一行改成了PartialFunction第二部分。

爲什麼?這與Map一樣適用。

在您的解決方案,是否有任何方式來定義局部函數的域是有限集合keys

def f: MethodMap = { case key if keys.contains(key) => ... } 

當然,域不是類型的一部分。

+0

在你的解決方案中,是否有任何方法可以將部分函數的域定義爲有限集'keys'而不是更普通的'Key'類型? – Mahdi

+0

這個'if'和'Map'一樣好用(當然,你需要到處使用相同的類型)。編輯回答你的第二個評論。 –

相關問題