我正在实现一些具有签名方法的特征,如
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)
}
但是当我知道方法和函数具有相似的签名时,这似乎有些过分。我希望这可以通过部分功能应用来完成,但我似乎无法使其工作。
答案 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
定义的情况下向类添加方法。