scala - 如何编写 "orElse"的惰性可变参数版本

标签 scala option variadic-functions lazy-evaluation

是否可以写一个概括的orElse方法来自 Option这需要可变数量的参数?也就是说,而不是:

lazy val o1 = { println("foo"); None }
lazy val o2 = { println("bar"); Some("bar") }
lazy val o3 = { println("baz"); Some("baz") } 
// ...
o1 orElse o2 orElse o3 // orElse ...

你可以使用:
orElse(o1, o2, o3) //, ...

最佳答案

根据The Scala Language Specification (4.6 函数声明和定义)你不能通过名称参数定义 varargs:

ParamType ::= Type
| ‘=>’ Type
| Type ‘*’

scala> def orElse(x : (=> String)*)
<console>:1: error: no by-name parameter type allowed here
       def orElse(x : (=> String)*)

您可以用函数和隐式类型转换替换惰性参数:
def orElse[T](x : (()=> Option[T])*) : Option[T] = 
    if(x.isEmpty) None else x.first.apply.orElse(orElse((x drop 1) :_*))
implicit def anyToFun0[T](t : => T) : (() => T) = () => t
orElse(o1, o2, o3)

关于scala - 如何编写 "orElse"的惰性可变参数版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1826145/

相关文章:

java - 谁能给我推荐一个好的库来在 java/scala 中应用机器学习?

scala - 如何从 IntelliJ IDEA CE 中执行 SBT 插件的任务?

graph - float 图表标题选项?

已知类型的 C++ 可变参数函数模板

scala - Akka Http路由测试: Request was neither completed nor rejected within 1 second

scala - 如何找出导致特定库下载的依赖关系?

scala - 如何使用类型级别的猫将 `Either[Error, Option[Either[Error, Account]]]` 转换为 `Either[Error, Option[Account]]`?

.net - 异常处理中的选项与异常

c# - 记录带有可变数量的 printf 样式参数的消息

Java:可变参数声明的构造函数