복붙노트

[SCALA] 삼항 연산자 유사하려면?

SCALA

삼항 연산자 유사하려면?

이 같은 피할 구조에 노력하고 있습니다 :

val result = this.getClass.getSimpleName
if (result.endsWith("$")) result.init else result

좋아,이 예제에서는 다음과 다른 지점은 간단합니다,하지만 당신은 이미지 복잡한 것들을 할 수 있습니다. 나는 다음을 구축 :

object TernaryOp {
  class Ternary[T](t: T) {
    def is[R](bte: BranchThenElse[T,R]) = if (bte.branch(t)) bte.then(t) else bte.elze(t)
  }
  class Branch[T](branch: T => Boolean) {
    def ?[R] (then: T => R) = new BranchThen(branch,then)
  }
  class BranchThen[T,R](val branch: T => Boolean, val then: T => R)
  class Elze[T,R](elze: T => R) {
    def :: (bt: BranchThen[T,R]) = new BranchThenElse(bt.branch,bt.then,elze)
  }
  class BranchThenElse[T,R](val branch: T => Boolean, val then: T => R, val elze: T => R)
  implicit def any2Ternary[T](t: T) = new Ternary(t)
  implicit def fct2Branch[T](branch: T => Boolean) = new Branch(branch)
  implicit def fct2Elze[T,R](elze: T => R) = new Elze(elze)
}

내가 가진 위의 간단한 예를 대체 할 수 있다고 정의 :

this.getClass.getSimpleName is {s: String => s.endsWith("$")} ? {s: String => s.init} :: {s: String => s}

그러나 어떻게이의 제거 할 수 있습니다 문자열 =>? 나는 그런 일을합니다 :

this.getClass.getSimpleName is {_.endsWith("$")} ? {_.init} :: {identity}

나는 컴파일러가 추론 유형에 여분의 물건을 필요 같아요.

해결법

  1. ==============================

    1.우리는 최고의 토큰을 보존 스칼라에서 삼항 연산자를 정의하는 방법을 결합 할 수 있습니다? 값이 좋은 패턴을 배치됩니다 옵션에 대한 대답으로? 얻을 수

    우리는 최고의 토큰을 보존 스칼라에서 삼항 연산자를 정의하는 방법을 결합 할 수 있습니다? 값이 좋은 패턴을 배치됩니다 옵션에 대한 대답으로? 얻을 수

    scala>   "Hi".getClass.getSimpleName |> {x => x.endsWith("$") ? x.init | x}
    res0: String = String
    
    scala> List.getClass.getSimpleName |> {x => x.endsWith("$") ? x.init | x}
    res1: String = List
    

    이 귀하의 요구에 적합한가요?

  2. ==============================

    2.토니 모리스 '람다 블로그에서 :

    토니 모리스 '람다 블로그에서 :

  3. ==============================

    3.렉스 커의 대답은 기본 스칼라로 표현 :

    렉스 커의 대답은 기본 스칼라로 표현 :

    "Hi".getClass.getSimpleName match {
      case x if x.endsWith("$") => x.init
      case x => x
    }
    

    나는 최적화 할 어떤 경우 - 다른 구조의 일부가 확실하지 않다 있지만.

  4. ==============================

    4.스칼라의 경우 - 다른 구조가 값을 반환하기 때문에, 당신은이를 사용할 수 있습니다

    스칼라의 경우 - 다른 구조가 값을 반환하기 때문에, 당신은이를 사용할 수 있습니다

    val a = if (1 < 0) 1 else 2
    

    추가 정보 : https://alvinalexander.com/scala/scala-if-then-ternary-operator-cookbook-examples

  5. ==============================

    5.당신은 항상 다시 진드기로 탈출로 확인하지 않는 한 그 자체로 유효한 연산자를하지 않습니다 : 때문에, 당신은 다른 문자, 예를 들어, 함께 갈 수 "|" 위의 답변 중 하나로서. 그러나 어떻게 수염 엘비스는? ::

    당신은 항상 다시 진드기로 탈출로 확인하지 않는 한 그 자체로 유효한 연산자를하지 않습니다 : 때문에, 당신은 다른 문자, 예를 들어, 함께 갈 수 "|" 위의 답변 중 하나로서. 그러나 어떻게 수염 엘비스는? ::

    implicit class Question[T](predicate: => Boolean) {
      def ?(left: => T) = predicate -> left
    }
    implicit class Colon[R](right: => R) {
      def ::[L <% R](pair: (Boolean, L)): R = if (q._1) q._2 else right
    }
    val x = (5 % 2 == 0) ? 5 :: 4.5
    

    그들이 가지고 있기 때문에 :: 연산자를 스스로 물론이 다시 값은 목록입니다하지 작동합니다.

  6. from https://stackoverflow.com/questions/4947535/ternary-operator-similar-to by cc-by-sa and MIT license