我是Scala的新手,并尝试学习不同的功能。 我试图在特征中声明一个curried函数(需要两个不同的参数),一半在扩展类中实现它,然后允许用户调用函数只传递第二个参数。
这样的事情:
宣称咖喱功能的特征:
trait MetricGenerator[T] {
def NextMetricCurrying(generateVal: =>Future[MetricValue[T]])(target: ActorRef): Unit = {
generateVal onSuccess {case mv:MetricValue[T] => println(target.path.name + " | "+ mv.toString )}
}
}
现在,我想扩展一个具有此特征的类,然后“half”实现它(通过传递它的第一个函数参数),以便该类的用户将其称为常规函数(而不是curry)。
我尝试过这样的事情:
class MemoryReader extends MetricGenerator[Long]{
NextMetricCurrying({
val p = Promise[MetricValue[Long]]
builder(sigar => sigar.getMem) onSuccess {
case Success(mem) => p.success(MetricValue[Long](category, key, computerId, mem.getFree /
1024 / 1024))
}
p.future
})
}
但它不起作用。
有什么想法吗?
答案 0 :(得分:1)
只使用第一个参数部分应用该函数后,您将获得ActorRef => Unit
。如果这是您想要作为函数公开的内容,则需要进行分配。
class Foo extends MetricGenerator[Long] {
val preparedFun: ActorRef => Unit = NextMetricCurrying(???)
// note the form A => B
}
val bar = new Foo
bar.preparedFun(anActorRef)
请注意,如果您希望在preparedFun
实例后立即调用MetricGenerator
,则可以按以下方式重构:
trait MetricGenerator[T] {
protected def NextMetricCurrying(a: => Future[MetricValue[T]])(b: ActorRef): Unit
val preparedFun: ActorRef => Unit
}
为了进一步混合继承和功能,它也可以定义如下。
trait MetricGenerator[T] {
protected def NextMetricCurrying(a: => Future[MetricValue[T]])(b: ActorRef): Unit
def nextValue: Future[MetricValue[T]]
final def preparedFun: ActorRef => Unit = NextMetricCurrying(nextValue)
}