scala - 将函数转换/门面化为方法

标签 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)
}

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

最佳答案

如果你想要的是类似的东西

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/

相关文章:

scala - 如何丰富包对象?

multithreading - 为什么 scala 在计算 Future 中的按名称参数时会挂起?

scala - 在 Scala 的类构造函数中引用抽象类型成员

scala - 在 Spark 中读取 Avro 文件

scala - 为什么在加载 Scala 构建文件时会出现编译错误?

xml - 在 Scala 中查找 XML 元素的第一个子元素

scala - 在公共(public)/开源 Scala API 中使用 Try 或 Either 进行错误处理是否存在问题?

list - 在Scala中将元素从一个列表复制到另一个列表

Scala:谁能解释一下?

scala - Spark : Create temporary table by executing sql query on temporary tables