在scala中是否有一种方法可以定义一个函数 prototype ,以便它具有像常规函数一样的参数名称?例如,我有一个工厂,我可以表示为这样的单一功能特性:
trait FactoryTrait {
def build(factory: ActorRefFactory, id: Int, creator: ActorRef): ActorRef
}
如果我将此作为参数传递给类并调用它,检查类型可以告诉我不仅build
采用三个参数及其类型,而且还有描述性名称。但是我必须传递工厂的实例并调用factory.build(actorRefFactory, id, creator)
而不仅仅是一个简单的函数。
另一方面,如果我将工厂定义为如下类型:
type FactoryDef = (ActorRefFactory, Int, ActorRef) => ActorRef
我可以直接将函数引用作为arg传递,我可以调用factory(actorRefFactory, id, creator)
但是factory
的检查缺少描述性参数命名,例如,IntelliJ只调用它们v1, v2, v3
。虽然这似乎是一个微不足道的抱怨,但当工厂采用多个ActorRef
时,签名变得难以理解。
是否有另一种定义保留参数名称的函数引用的方法?
答案 0 :(得分:4)
不,没有。但你可以
调用方法apply
而不是build
。这允许您只编写factory(actorRefFactory, id, creator)
。
添加从函数到工厂特征的转换(可能是隐式的):
object FactoryTrait {
def apply(f: (ActorRefFactory, Int, ActorRef) => ActorRef) = new FactoryTrait {
def apply(factory: ActorRefFactory, id: Int, creator: ActorRef): ActorRef =
f(factory, id, creator)
}
}
val factory = FactoryTrait { (factory, id, creator) => ... }
factory(f, i, c)