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
'IT이야기' 카테고리의 다른 글
.NET의 파일 확장자 및 MIME 유형 (0) | 2021.03.23 |
---|---|
MVC2의 이미지 및 robots.txt에 "IController를 구현하지 않음"오류가 발생할 경우 (0) | 2021.03.23 |
Android : 모달 대화 상자 또는 유사한 모달 동작을 얻는 방법 (0) | 2021.03.23 |
전체 프로젝트 / 폴더에서 단어를 재귀적으로 검색 (0) | 2021.03.23 |
오프라인 사용을위한 MDN 자바 스크립트 문서 (0) | 2021.03.22 |