如果仅为无,则如何分配给选项

Ant*_*min 4 ruby scala

在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)

sen*_*nia 5

有一个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.