加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如果仅为None,则如何分配给Option

发布时间:2020-12-17 04:01:33 所属栏目:百科 来源:网络整理
导读:在 ruby中,可以这样做: first ||= number 并且只有在数字为零时才会得到数字的值 如何在scala中做类似的事情? 到目前为止,我已经想出了这个并且看起来不像ruby那么好. var first: Option[Int] = None...first = if (first == None) Option(number) else fi
在 ruby中,可以这样做:

first ||= number

并且只有在数字为零时才会得到数字的值

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

到目前为止,我已经想出了这个并且看起来不像ruby那么好.

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

解决方法

这不是最佳做法或任何事情,但这里有类似的事情你可以做:

scala> implicit class RubyFriend[T](val value: Option[T]) extends AnyVal {
     |   def ||=(alt: T): Option[T] = value orElse Some(alt)
     | }
defined class RubyFriend

scala> var something: Option[Int] = None
something: Option[Int] = None

scala> something = something ||= 5
something: Option[Int] = Some(5)

scala> something ||= 4
res11: Option[Int] = Some(5)

scala> (None: Option[Int]) ||= 3
res12: Option[Int] = Some(3)

我们创建了一个从Option到RubyFriend的隐式转换,它具有|| =方法.这是一个皮条客我的图书馆模式.据我所知,在Scala赋值中它无法真正分配给原始变量的唯一区别是不能重载.

总体上尽量避免Scala中的变量.

这是另一种尝试,使它更像Ruby:

scala> import scala.language.implicitConversions
import scala.language.implicitConversions

scala> implicit class RubyFriend[T](var value: Option[T]) {
     |   def ||=(alt: T): Unit = value = value orElse Some(alt)
     | }
defined class RubyFriend

scala> implicit def ruby2Option[T](smth: RubyFriend[T]): Option[T] = smth.value
ruby2Option: [T](smth: RubyFriend[T])Option[T]

scala> var ropt: RubyFriend[Int] = None
ropt: RubyFriend[Int] = RubyFriend@2d483fef

scala> ropt.value
res0: Option[Int] = None

scala> val opt: Option[Int] = ropt
opt: Option[Int] = None

scala> ropt ||= 6

scala> ropt.value
res2: Option[Int] = Some(6)

scala> val opt: Option[Int] = ropt
opt: Option[Int] = Some(6)

scala> ropt ||= 7

scala> ropt.value
res4: Option[Int] = Some(6)

这使得围绕Option的包装类并且隐式地来回转换.同时,可选值表示为可变字段(yikes).

这两个例子只是为了说明Scala中可能的不是一个很好的方法:).

@senia建议的第一个例子的“改进”:

scala> implicit class RubyFriend[T](val value: Option[T]) extends AnyVal {
     |   def ||(alt: T): Option[T] = value orElse Some(alt)
     | }
defined class RubyFriend

scala> var something: Option[Int] = None
something: Option[Int] = None

scala> something ||= 5

scala> something
res1: Option[Int] = Some(5)

scala> something ||= 6

scala> something
res3: Option[Int] = Some(5)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读