gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:05:08 24 4
gpt4 key购买 nike

是否可以写一个概括的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com