我有许多正在实现的特征,它们具有类似签名的方法
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)
}
但是当我知道方法和函数具有相似的签名时,这似乎有点过分了。我希望这可以通过部分功能应用程序来完成,但我似乎无法让它工作。
最佳答案
如果你想要的是类似的东西
def getMyThing(key: String): Future[Option[MyThing]] = getMyThingGenerated
那么我认为 Scala 不可能(至少没有宏)。重要的是要认识到,即使定义一个方法包含一个 =
符号,它也不是一个赋值。虽然这有效
val getMyThing: String => Future[Option[MyThing]] = getMyThingGenerated
def
的类似语法无效。斯卡拉 specification指出函数体是“定义函数结果的表达式”。要获得正确类型的表达式,您需要应用您的函数,这就是您在示例中显示的内容:
def setMyThing(data: MyThing, key: String): Future[Boolean] = setMyThingGenerated(data, key))
我不知道如何在没有具有这些限制的 def
定义的情况下向类添加方法。
关于scala - 将函数转换/门面化为方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37046517/