在ruby中,可以这样做:
first ||= number
Run Code Online (Sandbox Code Playgroud)
和第一会得到数的值,只有当它是零
如何在scala中做类似的事情?
到目前为止,我已经想出了这个并且它看起来不像红宝石那么好.
var first: Option[Int] = None
...
first = if (first == None) Option(number) else first
// or
first = Some(first.getOrElse(number))
Run Code Online (Sandbox Code Playgroud)
有一个scalaz运营商:
import scalaz._, Scalaz._
none[Int] <+> 1.some
// Some(1)
2.some <+> 1.some
// Some(2)
Run Code Online (Sandbox Code Playgroud)
您可以使用a <+>= b而不是a = a <+> b:
var i = none[Int] // i == None
i <+>= 1.some // i == Some(1)
i <+>= 2.some // i == Some(1)
Run Code Online (Sandbox Code Playgroud)
又见加[F [_]在scalaz的cheatsheet.
对于Option plus正在实施的orElse.
对于集合(List,Vector,Stream等)Plus被实现为append:
Vector(1, 2) <+> Vector(3, 4)
// Vector(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
我找不到一个方法来组合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)
Run Code Online (Sandbox Code Playgroud)
您可以重命名此方法||,并使用它像||=只是喜欢Ruby,但是这个名字可以混淆其他开发商-已经有方法||的Boolean.