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