Development Tip

Scala의 "접미사 작업"

yourdevel 2021. 1. 7. 20:06
반응형

Scala의 "접미사 작업"


30 분 동안 검색했지만 여전히 알아낼 수 없습니다.

에서 SIP : 모듈화 언어 특징 명시 적 (스칼라 2.10에서 "활성화"를 필요로 많은 기능이있다 import language.feature). 그들 중에는 postfixOps어디에서도 참조를 찾을 수 없습니다. 이 기능이 정확히 무엇을 허용합니까?


접미사 위치에서 연산자 구문을 사용할 수 있습니다. 예를 들면

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호출 결과에 대해 메서드 를 호출하려고 합니다 Unit. 이것은 프로그래머가 의도 한 것이 아닐 가능성이 높습니다. 올바른 결과를 얻으려면 첫 번째 줄 뒤에 세미콜론을 삽입해야합니다.


가장 간단한 대답 :

매개 변수가없는 메소드에서 점을 삭제하는 것은 DEPRECATED입니다 !

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)

map, filter, count와 같은 고차 함수 의 하나의 매개 변수를 취하는 메소드에 점을 찍어도 안전합니다! 또한 zip과 같은 순전히 기능적인 방법입니다.

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) 하나 이상의 매개 변수가있는 메소드는 매개 변수로 호출하면 점없이 연결됩니다. def a (), def a (x), def a (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)

샘플 경고 :

warning: there were 1 deprecation warning(s); re-run with -deprecation for details warning: postfix operator tail should be enabled by making the implicit value scala.language.postfixOps visible. This can be achieved by adding the import clause 'import scala.language.postfixOps' or by setting the compiler option -language:postfixOps. See the Scala docs for value scala.language.postfixOps for a discussion why the feature should be explicitly enabled.


It refers to the ability to call a nullary (with no arg list or empty arg list) method as a postfix operator:

By example:

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

See: http://www.scala-lang.org/node/118

ReferenceURL : https://stackoverflow.com/questions/13011204/scalas-postfix-ops

반응형