Scala - 是不是可以编写具有可变参数的 HOF?

Posted

技术标签:

【中文标题】Scala - 是不是可以编写具有可变参数的 HOF?【英文标题】:Scala - is it possible to write HOF that has varargs?Scala - 是否可以编写具有可变参数的 HOF? 【发布时间】:2022-01-23 20:33:41 【问题描述】:

我能否有一个返回func(varargs*) 的高阶函数,例如(s: String*) => String

我正在尝试执行以下操作:

  def concatKeys(delimiter: String) = 
    def concat(k1: String, k2: String): String = if (k1.isEmpty) k2 else k1 + delimiter + k2

    (keys: String*) => keys.foldLeft("")(concat)
  

但是当我按预期使用时,代码没有编译:

      val key: String = concatKeys(delimiter)(keyAcc, kv._1)

如果我把它改成Traversable:

  def concatKeys(delimiter: String) = 
    def concat(k1: String, k2: String): String = if (k1.isEmpty) k2 else k1 + delimiter + k2

    (keys: Traversable[String]) => keys.foldLeft("")(concat)
  

自然编译:

      val key: String = concatKeys(delimiter)(Set(keyAcc, kv._1))

那么,不可能返回带有可变参数的 HOF 吗?如果没有,为什么不呢?

谢谢大家!

【问题讨论】:

已经有一个.mkString 用于执行此操作的集合。 很高兴知道。 :D 谢谢。 【参考方案1】:

Varargs 不是有效类型,它们只是仅在方法中可用的糖语法,在函数中不可用。 请记住,在方法体内,可变参数实际上只是一个Seq

所以不,你不能。

【讨论】:

以上是关于Scala - 是不是可以编写具有可变参数的 HOF?的主要内容,如果未能解决你的问题,请参考以下文章

使用Scala中的不可变值查找路径是不是存在于图形中

Scala 可变长参数

Scala函数使用可变参数

Scala可变参数列表,命名参数和参数缺省

Scala:可变参数 UDF

为具有可变数量参数的不同函数编写通用包装器