gpt4 book ai didi

ruby - 如何仅在选项为 None 时分配给选项

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:04 24 4
gpt4 key购买 nike

在 ruby​​ 中可以这样做:

first ||= number

first只有当number为nil时才会获取number的值

如何在 Scala 中做类似的事情?

到目前为止,我已经想到了这个,但它看起来不像在 ruby​​ 中那么好。

var first: Option[Int] = None
...
first = if (first == None) Option(number) else first
// or
first = Some(first.getOrElse(number))

最佳答案

有一个 scalaz 运算符:

import scalaz._, Scalaz._

none[Int] <+> 1.some
// Some(1)

2.some <+> 1.some
// Some(2)

你可以使用 a <+>= b而不是 a = a <+> b :

var i = none[Int] // i == None
i <+>= 1.some // i == Some(1)
i <+>= 2.some // i == Some(1)

另请参阅 scalaz cheatsheet 中的 Plus[F[_]] .

对于 Option plusimplemented作为orElse .

对于集合( ListVectorStream 等) Plus实现为 append :

Vector(1, 2) <+> Vector(3, 4)
// Vector(1, 2, 3, 4)

我找不到合并Option[T]的方法和 T按照你想要的方式,但你可以这样写这样的方法:

implicit class PlusT[T, M[_]: Plus : Applicative](m: M[T]) {
def ?+?(t: T) = m <+> t.point[M]
}

none[Int] ?+? 1
// Some(1)

2.some ?+? 1
// Some(2)

var i = none[Int] // i == None
i ?+?= 1 // i == Some(1)
i ?+?= 2 // i == Some(1)

您可以将此方法重命名为 ||并像||=一样使用它就像在Ruby ,但这个名称可能会让其他开发人员感到困惑 - 已经有方法 ||对于 Boolean .

关于ruby - 如何仅在选项为 None 时分配给选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20919444/

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