在ruby中,可以这样做:
first ||= number
和第一会得到数的值,只有当它是零
如何在scala中做类似的事情?
到目前为止,我已经想出了这个并且它看起来不像红宝石那么好.
var first: Option[Int] = None ... first = if (first == None) Option(number) else first // or first = Some(first.getOrElse(number))
senia.. 5
有一个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)
又见加[F [_]在scalaz的cheatsheet.
对于Option
plus
正在实施的orElse
.
对于集合(List
,Vector
,Stream
等)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
.
有一个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)
又见加[F [_]在scalaz的cheatsheet.
对于Option
plus
正在实施的orElse
.
对于集合(List
,Vector
,Stream
等)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
.