【问题标题】:Define a function reference so that it retains its argument names定义一个函数引用,使其保留其参数名称
【发布时间】:2015-09-16 05:32:06
【问题描述】:

在 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。虽然这似乎是一个微不足道的抱怨,但当工厂采用多个 ActorRefs 时,签名很快就会变得难以阅读。

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

【问题讨论】:

  • 您能否提供更多有关您的用例的详细信息? type FactoryDef = (ActorRefFactory, Int, ActorRef) => ActorRef 有点通过闭包暴露演员内部,这可能不是一个好主意。
  • 用例是一个创建子actor的actor,我不想对其进行硬编码。我注入factory 而不是props 函数的原因——除了它有相同的签名问题——是因为props 我不能用TestProbe 代替创建的孩子

标签: scala


【解决方案1】:

不,没有。但是你可以

  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)
    

【讨论】:

  • 我不知道我是怎么忘记apply的。这正是我想要的,它的用途是什么。谢谢!
猜你喜欢
  • 2019-03-11
  • 1970-01-01
  • 2017-10-20
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多