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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |