定义函数引用,以便保留其参数名称

时间:2015-09-16 05:32:06

标签: scala

在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时,签名变得难以理解。

是否有另一种定义保留参数名称的函数引用的方法?

1 个答案:

答案 0 :(得分:4)

不,没有。但你可以

  1. 调用方法apply而不是build。这允许您只编写factory(actorRefFactory, id, creator)

  2. 添加从函数到工厂特征的转换(可能是隐式的):

    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)