将函数转换/取代到方法

时间:2016-05-05 09:03:11

标签: scala

我正在实现一些具有签名方法的特征,如

trait MyCache {

     def getMyThing(key: String): Future[Option[MyThing]] 

     def setMyThing(data: MyThing, key: String): Future[Boolean] 

}

我还有这些getter和setter的生成器函数,它们生成(几乎)映射到这些方法特征的函数。简化的getter和setter生成器使用签名

生成函数(而不是方法)
val getMyThingGenerated: String => Future[Option[MyThing]]

val setMyThingGenerated: (MyThing, String) => Future[Boolean]

我想在这些生成的函数和类方法之间以简洁的方式进行映射,但我不确定如何。

我可以写点像

class CacheImplementation extends MyCache {

    def getMyThing(key: String): Future[Option[MyThing]] = 
        getMyThingGenerated(key)

    def setMyThing(data: MyThing, key: String): Future[Boolean] =
        setMyThingGenerated(data, key)
}

但是当我知道方法和函数具有相似的签名时,这似乎有些过分。我希望这可以通过部分功能应用来完成,但我似乎无法使其工作。

1 个答案:

答案 0 :(得分:2)

如果您想要的是与

类似的东西
def getMyThing(key: String): Future[Option[MyThing]] = getMyThingGenerated

然后我认为Scala不可能(至少没有宏)。要认识到的重要一点是,即使定义一个方法包含=符号,它也不是一个赋值。这虽然有效

val getMyThing: String => Future[Option[MyThing]] = getMyThingGenerated

def的类似语法无效。 Scala specification声明函数体是“定义函数结果的表达式”。要获得正确类型的表达式,您需要应用函数,这是您在示例中显示的函数:

def setMyThing(data: MyThing, key: String): Future[Boolean] = setMyThingGenerated(data, key))

我不知道如何在没有具有这些限制的def定义的情况下向类添加方法。