문제

문자열 배열을 생성자 인수로 취하고 멤버 vals로 명령 줄 옵션 값이있는 클래스를 만들고 싶습니다. 아래와 비슷하지만 Bistate가 어떻게 작동하는지 이해하지 못합니다.

import scalax.data._
import scalax.io.CommandLineParser

class TestCLI(arguments: Array[String]) extends CommandLineParser {
    private val opt1Option = new Flag("p", "print") with AllowAll
    private val opt2Option = new Flag("o", "out") with AllowAll
    private val strOption = new StringOption("v", "value") with AllowAll
    private val result = parse(arguments)
    // true or false
    val opt1 = result(opt1Option)
    val opt2 = result(opt2Option)
    val str = result(strOption)
}
도움이 되었습니까?

해결책

다음은 부울을 얻기 위해 해당 패턴 일치에 대한 대안이 더 짧습니다.

val opt1 = result(opt1Option).isInstanceOf[Positive[_]]
val opt2 = result(opt2Option).posValue.isDefined

두 번째는 아마도 더 나을 것입니다. 필드 posvalue 옵션입니다 (거기에 있습니다 네거티브 또한). 방법 정의되었습니다 옵션에서 일부 (x)인지 아닌지 알려줍니다.

다른 팁

나는 Scalax 또는 개인적으로 익숙하지 않습니다 Bistate 특히, 그러나 Scaladocs를 보면 왼쪽 오른쪽 분리처럼 보입니다. Scala의 메인 도서관에는 이와 같은 모나드가 있습니다 (Either), 그래서 나는 그들이 표준을 사용하지 않았다는 것에 놀랐습니다.

본질적으로, Bistate 그리고 Either 조금 비슷합니다 Option, 그들의 "None-동등한 "값을 포함 할 수 있습니다. 예를 들어, 코드를 사용하여 코드를 작성하는 경우 Either, 나는 다음과 같은 일을 할 수 있습니다.

def div(a: Int, b: Int) = if (b != 0) Left(a / b) else Right("Divide by zero")

div(4, 2) match {
  case Left(x) => println("Result: " + x)
  case Right(e) => Println("Error: " + e)
}

이것은 인쇄 할 것입니다 "Result: 2".이 경우 우리는 사용하고 있습니다 Either 예외를 시뮬레이션합니다. 우리는 인스턴스를 반환합니다 Left 어떤 이유로 그 값을 계산할 수없는 한, 우리가 원하는 값을 포함하는 경우,이 경우 인스턴스 내부에 마무리 된 오류 메시지를 반환합니다. Right.

그래서 플래그가 발견되는지에 대한 가변 부울 값에 할당하려면 아래에서 좋아해야합니까?

val opt1 = result(opt1Option) match {
    case Positive(_) => true
    case Negative(_) => false
}

이 공동 사례를 그보다 적은 코드로 작성하는 방법이 없습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top