Scala 定义函数引用,使其保留参数名称

Scala 定义函数引用,使其保留参数名称,scala,Scala,在scala中有没有一种方法可以定义一个函数原型,使其具有像常规函数一样的参数名?例如,我有一个工厂,我可以表示为一个单一的功能特征,如下所示: trait FactoryTrait { def build(factory: ActorRefFactory, id: Int, creator: ActorRef): ActorRef } 如果我将其作为参数传递给一个类并调用它,那么对类型的检查不仅可以告诉我build接受三个参数及其类型,还可以使用描述性名称。但我必须传递工厂的实例并调用f

在scala中有没有一种方法可以定义一个函数原型,使其具有像常规函数一样的参数名?例如,我有一个工厂,我可以表示为一个单一的功能特征,如下所示:

trait FactoryTrait {
  def build(factory: ActorRefFactory, id: Int, creator: ActorRef): ActorRef
}
如果我将其作为参数传递给一个类并调用它,那么对类型的检查不仅可以告诉我
build
接受三个参数及其类型,还可以使用描述性名称。但我必须传递工厂的实例并调用
factory.build(actorrefactory,id,creator)
,而不仅仅是一个简单的函数

另一方面,如果我将工厂定义为以下类型:

type FactoryDef = (ActorRefFactory, Int, ActorRef) => ActorRef
我可以将函数引用直接作为参数传递,我可以调用
工厂(ActorRefactory,id,creator)
,但是
工厂的检查
缺少描述性参数命名,例如,IntelliJ只调用它们
v1,v2,v3
。虽然这似乎是一个微不足道的投诉,但当工厂采用多个
ActorRef
s时,签名很快就会变得无法读取


有没有其他方法可以定义保留参数名称的函数引用?

没有。但是你可以

  • 调用方法
    apply
    ,而不是
    build
    。这允许您只编写
    工厂(actorrefactory、id、creator)

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


  • 您能提供一些关于您的用例的更多细节吗<代码>类型FactoryDef=(ActorRefactory,Int,ActorRef)=>ActorRef
    有点通过闭包暴露actor内部的味道,这可能不是一个好主意。用例是一个创建子actor的actor,我不想硬编码创建子actor。我之所以注入
    工厂
    而不是
    道具
    函数——除了它有相同的签名问题——是因为使用
    道具
    我无法用
    测试探针
    替换所创建的孩子,我不知道我是如何忘记了
    应用
    。这正是我想要的,也是我做这个的目的。谢谢
    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)