IT이야기

Scala의 '::'연산자에 대하여

cyworld 2021. 3. 23. 21:13
반응형

Scala의 '::'연산자는 어떻게 작동합니까?


Scala에서 caseclass case class Foo(x:Int)를 만들고 다음과 같이 목록에 넣을 수 있습니다.

List(Foo(42))

자, 여기서 이상한 것은 없습니다. 다음은 나에게 이상합니다. 연산자 ::는 목록의 기능입니다. Scala에서 인수가 하나 인 함수를 사용하면 중위 표기법으로 호출 할 수 있습니다. 예는 객체에 1 + 2대한 함수 (+)입니다 Int. Foo방금 정의한 클래스 에는 ::연산자 가 없습니다. 어떻게 다음이 가능합니까?

Foo(40) :: List(Foo(2))

Scala 2.8 RC1에서는 대화 형 프롬프트에서 다음과 같은 출력을 얻습니다.

scala> case class Foo(x:Int)
defined class Foo

scala> Foo(40) :: List(Foo(2))
res2: List[Foo] = List(Foo(40), Foo(2))

계속해서 사용할 수 있지만 설명은 무엇입니까?


사양에서 :

6.12.3 InfixOperations 중위 연산자는 임의의 식별자가 될 수 있습니다. 중위 연산자는 다음과 같이 정의 된 우선 순위와 연관성을 갖습니다.

...

연산자의 연관성은 연산자의 마지막 문자에 의해 결정됩니다. 콜론 ':'으로 끝나는 연산자는 오른쪽 연관입니다. 다른 모든 연산자는 왼쪽 연관입니다.

컴파일러의 '타이 퍼'단계를 거친 후 프로그램을 인쇄하여 Scala에서 이러한 규칙이 어떻게 적용되는지 항상 확인할 수 있습니다.

scala -Xprint:typer -e "1 :: Nil"

val r: List[Int] = {
  <synthetic> val x$1: Int = 1;
  immutable.this.Nil.::[Int](x$1)
};

그것은 끝납니다 :. 이것이 바로이 함수가 오른쪽에있는 List클래스 (여기 클래스에서) 에 정의되어 있다는 표시 입니다.

그래서, 그건 List(Foo(2)).::(Foo(40))아니, Foo(40).::(List(Foo(2)))당신의 예에.


주어진 답변에서 누락 된 한 가지 측면 ::은 패턴 일치 표현식에서 지원 하는 것입니다.

List(1,2) match {
  case x :: xs => println(x + " " + xs)
  case _ => println("")
}

클래스 :: 정의 :

final case class ::[B](private var hd: B, private[scala] var tl: List[B]) 

따라서 case ::(x,xs)동일한 결과가 생성됩니다. case x :: xs기본 추출기 ::가 케이스 클래스에 대해 정의되고 중위로 사용될 수 있기 때문에 표현식이 작동합니다 .


Foo방금 정의한 클래스 에는 ::연산자가 없으므로 다음과 같은 방법이 있습니다.

Foo(40) :: List(Foo(2))

메서드 이름이 콜론 ( :)으로 끝나면 오른쪽 피연산자 에서 메서드가 호출됩니다 . 메서드 이름이 콜론으로 끝나지 않으면 왼쪽 피연산자에서 메서드가 호출됩니다. 예를 들어 a + b, +에 호출됩니다 a.

따라서 귀하의 예에서 ::오른쪽 피연산자에있는 메서드는 List.

참조 URL : https://stackoverflow.com/questions/2827293/scalas-operator-how-does-it-work

반응형