【问题标题】:What is the shortest notation to define an operator as a method alias in Scala?在 Scala 中将运算符定义为方法别名的最短符号是什么?
【发布时间】:2012-01-02 13:56:10
【问题描述】:

鉴于下面的通用register 方法,我想将:= 运算符定义为符号别名。

def register[Prop <: Property[_]](prop: Prop): Prop

@inline
final def :=[Prop <: Property[_]] = register[Prop] _

本来想写这样的:

val := = register _

但这给了我函数签名Nothing =&gt; Nothing。我的下一个尝试是使用 Prop 类型对其进行参数化,但这显然只有在我将其设为 def 时才有效,它可以接受类型参数并继续传递它们。

理想情况下,我想省略 @inline 注释,但我不确定 Scala 编译器从中生成了什么目标代码。

最重要的我的目标是不要让:= 方法复制register 方法签名的所有部分(名称除外),然后简单地让前者委托给后者。

【问题讨论】:

    标签: scala methods operators alias


    【解决方案1】:
    def :=[Prop <: Property[_]](prop: Prop) = register(prop)
    

    应该可以。

    【讨论】:

    • 带有重复签名的方法委托正是我想要避免的。请参阅我的最后一段“最重要的......”。我也不想手动转发任何参数。
    • @TimFriske 不幸的是,如果你想这样做,你必须这样做。
    【解决方案2】:

    我不相信有任何方法可以在目前的 Scala 中实现您所追求的(基本上是 alias 在 Ruby 中为您提供的)。 autoproxy plugin 试图解决此类问题,但由于在编译器插件中生成代码的各种问题,它还没有真正准备好投入生产使用。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      def := : Prop => Prop = register
      

      所以基本上在这里你定义了一个类型为 (Prop => Prop) 的函数,它只引用另一个函数。

      【讨论】:

        猜你喜欢
        • 2012-12-15
        • 2012-05-16
        • 2021-02-13
        • 2022-01-16
        • 2010-11-12
        • 1970-01-01
        • 2019-07-24
        • 2016-12-16
        • 2012-06-14
        相关资源
        最近更新 更多