将固定数量的参数接收到 varargs scala 的转换函数

transform function that receives a fixed number of arguments to a varargs scala

是否有一种通用方法可以将固定大小的参数函数转换为执行相同操作但操作接收操作的函数 Seq

例如一个简单的加法函数

def add(x: Int, y:Int) = x + y

我如何将它一般地转换为:

def add2(x: Int*) = x(0) + x(1)

转换这两种表示的接口应该更通用,并接受可变数量的参数。

请注意,我不想在 运行 时间内执行此转换。

关键是,我希望我的库的用户给我 def add(x: Int, y:Int) = x + y 类型的函数,然后我通常会将其转换为 def add2(x: Int*) = x(0) + x(1) 以便能够将它们与我的引擎,它需要第二个表示

有一个方法,也许对你有帮助,你可以试试scala macro. and paradise

1.Need 在编译器中添加天堂,如:

addCompilerPlugin("org.scalameta" % "paradise" % "3.0.0-M5" cross CrossVersion.full)

2.add scala meta 依赖,如:

"org.scalameta" %% "scalameta" % "1.3.0"

3.Create 自定义 AutoVarargs 宏(它应该在 单独的模块 中与您的用法相符):

import scala.meta._

class AutoVarargs extends StaticAnnotation {
  inline def apply(defn: Any): Any = meta {
    defn match {
      case q"def add(...$paramss): Int = $expr" =>
        q"""
          def add(i: Int*): Int = {
            i.sum
          }
        """
    }
  }
}

4.use它:

object MetaMacro extends App{
  @AutoVarargs
  def add(x: Int, y: Int): Int = x + y
  println(add(2, 3))
  println(add(2, 3, 4, 5))
}

5.after编译:

  @AutoVarargs
  def add(x: Int, y: Int): Int = x + y

这将自动转换为:

  def add(x: Int*): Int = x.sum

因此对于您的图书馆的用户,他们可以将此 注释 与目标方法一起使用。