转换函数,它接收一个固定数量的参数给varargs scala

时间:2016-12-15 09:41:43

标签: scala variadic-functions

是否存在将固定大小的参数函数转换为执行相同操作的函数的通用方法,但是操作接收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),以便能够将它们与我的引擎一起使用,期望第二个表示

1 个答案:

答案 0 :(得分:1)

有一种方法,也许对您有所帮助,您可以尝试使用scala macro。和paradise

1.需要在编译器中添加天堂,例如:

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

2.add scala meta依赖,如:

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

3.创建自定义 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.使用它:

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.编译后:

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

这将自动转换为:

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

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