복붙노트

[SCALA] 스칼라의 "접미사 작전"

SCALA

스칼라의 "접미사 작전"

나는 30 분에 검색 한, 여전히 그것을 알아낼 수 없습니다.

SIP에서 : 모듈화 언어 스칼라 2.10 (수입 language.feature)의 "사용"을 명시 적으로 필요 기능의 숫자가 특징. 그들 사이에 난 그냥 어디서든 참조를 찾을 수있는, postfixOps있다. 정확히이 기능은 무엇을 할 수 있습니까?

해결법

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

    1.그것은 당신이 후위 위치에 연산자 구문을 사용할 수 있습니다. 예를 들면

    그것은 당신이 후위 위치에 연산자 구문을 사용할 수 있습니다. 예를 들면

    List(1,2,3) tail
    

    보다는

    List(1,2,3).tail
    

    이 무해한 예제에서는 문제가되지 않습니다,하지만 모호함으로 이어질 수 있습니다. 이 컴파일되지 않습니다 :

    val appender:List[Int] => List[Int] = List(1,2,3) ::: //add ; here
    List(3,4,5).foreach {println}
    

    그리고 오류 메시지가 매우 도움이되지 않습니다 :

        value ::: is not a member of Unit
    

    이 유형의 장치이다 foreach는 호출의 결과에 ::: 메소드를 호출하려고합니다. 이것은 프로그래머가 의도하지 무엇을 가능성이있다. 올바른 결과를 얻으려면, 당신은 첫 번째 행 다음에 세미콜론을 삽입해야합니다.

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

    2.지금까지 가장 간단한 대답은 :

    지금까지 가장 간단한 대답은 :

    매개 변수없이 방법에서 점을 삭제가되지 않습니다!

    List(1,2,3) reverse //is bad style and will lead to unpredicted behaviour
    List(1,2,3) map(_*2) reverse //bad too, because reverse can take first method call from the next line (details below)
    

    맵, 필터와 같은 고차 함수의 하나 개의 매개 변수를 사용 방법에 도트를 드롭 OK, 카운트 안전! 또한, 지퍼 등 순수 작용 방법.

    List(1,2,3) map(_*2) filter(_>2)
    (List(1,2,3) map(_*2)).reverse //safe and good
    List(1,3,5) zip List(2,4,6)
    

    긴 대답 왜

    case class MyBool(x: Boolean) {
      def !!! = MyBool(!x) //postfix
      def or(other: MyBool): MyBool = if(x) other else this //infix
      def justMethod0() = this //method with empty parameters
      def justMethod2(a: MyBool, b: MyBool) = this //method with two or more
      override def toString = if(x) "true" else "false"
    }
    

    1) 후위 연산자! -.! 실제로 방법 매개 변수없이 호출 (a가 == a)와 브래킷없이. (안전하지 간주되지 않음)

    val b1 = MyBool(false) !!!
    List(1,2,3) head
    

    2) 후위 연산자는 광고를 종료한다, 그렇지 않으면이 중위로 처리되도록, 방법.

    val b1 = MyBool(true) no! no! //ERROR
    //is actually parsed like
    val b2 = MyBool(true).no!(no!) //(no!) is unknown identifier
    //as bad as
    Vector(1,2,3) toList map(_*2) //ERROR
    

    3) 중위 연산자 도트 괄호없이 호출 될 수있는 하나 개의 파라미터와 방법이다. 오직 순수하게 기능적인 방법에 대한

    val c1 = MyBool(true) or b1 or MyBool(true)
    val c2 = MyBool(true).or(b1).or(MyBool(true))
    c1 == c2
    

    하나 개 이상의 매개 변수 4) 방법 것입니다 당신이 매개 변수를 호출하는 경우 점없이 체인. 데프 (), 데프 (X), 데프 (X, Y) 하지만 당신은 유일한 매개 변수로 고차 함수를 사용하는 방법에 대해이 작업을 수행해야합니다!

    val d1 = MyBool(true) justMethod2(b1, c1) or b1 justMethod0() justMethod2(c1, b1)
    //yes, it works, but it may be confusing idea
    val d2 = MyBool(true).justMethod2(b1,c1).or(b1).justMethod0().justMethod2(c1, b1)
    d1 == d2
    //looks familiar? This is where it should be used:
    List(1,2,3) filter(_>1) map(_*2)
    

    샘플 경고 :

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

    3.그것은 후위 연산자와 같은 방법 (아무 인수 목록 또는 빈 인수 목록과 함께) 인수 없음을 호출하는 기능을 말합니다 :

    그것은 후위 연산자와 같은 방법 (아무 인수 목록 또는 빈 인수 목록과 함께) 인수 없음을 호출하는 기능을 말합니다 :

    예를 들어 기준 :

    case class MyBool(value: Boolean) {
        def negated = new MyBool(!value)
    }
    val b1 = MyBool( true )
    val b2 = b1 negated // Same as b1.negated
    

    참조 : http://www.scala-lang.org/node/118

  4. from https://stackoverflow.com/questions/13011204/scalas-postfix-ops by cc-by-sa and MIT license