Program Club

스칼라 : 부울에서 옵션으로

proclub 2020. 12. 11. 18:58
반응형

스칼라 : 부울에서 옵션으로


부울이 있고이 패턴을 피하고 싶습니다.

if (myBool) 
  Option(someResult) 
else 
  None

내가하고 싶은 것은

myBool.toOption(someResult)

코드 예제에 대한 모든 제안을 주시면 감사하겠습니다.


시작 Scala 2.13, Optionwhen이 정확한 목적을 위해 빌더 :

Option.when(condition)(result)

예를 들면 :

Option.when(true)(3)
// Option[Int] = Some(3)
Option.when(false)(3)
// Option[Int] = None

또한 Option.unless반대 조건을 조장하는 것에 유의하십시오 .


Scalaz에는 BooleanOps.option 으로이를 수행하는 방법이 있습니다 . 그러면 다음과 같이 작성할 수 있습니다.

myBool.option(someResult)

Scalaz 종속성을 추가하지 않으려면 코드에 다음을 추가하십시오.

implicit class RichBoolean(val b: Boolean) extends AnyVal {
  final def option[A](a: => A): Option[A] = if (b) Some(a) else None
}

Option (). collect ()는 이런 종류의 일에 좋은 패턴입니다.

Option(myBool).collect { case true => someResult }

REPL에서 :

scala> (Option(true).collect { case true => 3 }, Option(false).collect { case true => 3 })
res3: (Option[Int], Option[Int]) = (Some(3),None)

다른 답변은 언급 된대로 질문에 대한 답변이 없습니다! 지정한 정확한 의미를 얻으려면 다음을 사용하십시오.

implicit class BoolToOption(val self: Boolean) extends AnyVal {
  def toOption[A](value: => A): Option[A] =
    if (self) Some(value) else None
}

그런 다음 쓸 수 있습니다.

myBool.toOption(someResult)

예 :

scala> true.toOption("hi")
res5: Option[String] = Some(hi)

scala> false.toOption("hi")
res6: Option[String] = None

당신 someResult의 가치에 상관없이 평가받는 것을 신경 쓰지 않는다면 myBool또한 사용할 수 있습니다

Some(someResult).filter(myBool)

scala> PartialFunction.condOpt(5) { case x if true => x }
res9: Option[Int] = Some(5)

scala> PartialFunction.condOpt(5) { case x if false => x }
res10: Option[Int] = None

여기서 가드는 조건을 보유하고 전달 condOpt된 값은 가드가 참으로 평가되면 반환되는 값입니다.


다른 선택 :

implicit class RichOptionCompanion(val self: Option.type) extends AnyVal {
  def when[A](cond: Boolean)(value: => A): Option[A] = if(cond) Some(value) else None
}

용법:

Option.when(foo != "bar") { ... }

class RichBool[T](a: Boolean, res:=> T) {
   def toOption: Option[T] = if (a) Some(res) else None
}
implicit def boolToRichBool[T](tp: (Boolean, T)): RichBool[T] = new RichBool(tp._1, tp._2);

이것은 당신에게 줄 것입니다 :

(true, 5).toOption // Some(5);
(false, 3).toOption // None

고려해야 할 몇 가지 사항은 다음과 같습니다.

val bool: Boolean = ???
val result = 1337    

Option(bool).withFilter(identity).map(_ => result)

또는

for {
  opt <- Option(bool)
  if opt
} yield result

참고 URL : https://stackoverflow.com/questions/19690531/scala-boolean-to-option

반응형