복붙노트

[SCALA] 스칼라의 '::'연산자, 어떻게 작동합니까?

SCALA

스칼라의 '::'연산자, 어떻게 작동합니까?

스칼라에서, 나는 caseclass, 사례 클래스 푸 (X : int)를 만들 수 있습니다, 다음과 같이 목록에 넣어 :

List(Foo(42))

자, 여기에 이상한 아무것도. 다음은 나에게 이상하다. 운영자는 :: 오른쪽 목록에서 함수? 스칼라에서 하나 개의 인수 어떤 기능으로, 나는 중위 표기법을 호출 할 수 있습니다. 예 1 + 2는 지능 객체의 기능 (+)이다. 클래스 푸 난 그냥 어떻게 가능한 다음되면, :: 연산자가없는 정의?

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

스칼라 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))

나는에 가서 그것을 사용하지만, 설명은 무엇인가 할 수 있습니까?

해결법

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

    1.스펙에서 :

    스펙에서 :

    당신은 항상 컴파일러의 '타이 퍼'상을 완료 한 후 프로그램을 인쇄하여이 규칙은 스칼라에 적용되는 방식을 볼 수 있습니다 :

    scala -Xprint:typer -e "1 :: Nil"
    
    val r: List[Int] = {
      <synthetic> val x$1: Int = 1;
      immutable.this.Nil.::[Int](x$1)
    };
    
  2. ==============================

    2.그것은으로 끝난다. 그리고 그 기호는이 기능이 (여기 List 클래스에서) 오른쪽에있는 클래스에 정의되어있다.

    그것은으로 끝난다. 그리고 그 기호는이 기능이 (여기 List 클래스에서) 오른쪽에있는 클래스에 정의되어있다.

    그래서, 그것의 목록 ​​(푸 (2)) : :( 푸 (40)),하지 푸 (40) : :( 목록 (푸 (2) 예)).

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

    3.주어진 답변에서 누락 한 측면은 패턴 매칭 표현에 그 :: 지원하는 것입니다 :

    주어진 답변에서 누락 한 측면은 패턴 매칭 표현에 그 :: 지원하는 것입니다 :

    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]) 
    

    그래서 경우 : :( X, XS)는 동일한 결과를 생성한다. 표현의 경우는 X : XS 작품을 기본 추출기가 :: 경우 클래스에 대해 정의하고 사용 중위가 될 수 있기 때문이다.

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

    4.콜론 메소드 이름이 종료 된 경우 (:)이 방법은 여기의 경우 오른쪽 피연산자에 호출됩니다. 메소드 이름은 콜론으로 끝나지 않는 경우, 메소드는 왼쪽 피연산자에 호출됩니다. 예를 들어, B는 +, + (A)에 호출된다.

    콜론 메소드 이름이 종료 된 경우 (:)이 방법은 여기의 경우 오른쪽 피연산자에 호출됩니다. 메소드 이름은 콜론으로 끝나지 않는 경우, 메소드는 왼쪽 피연산자에 호출됩니다. 예를 들어, B는 +, + (A)에 호출된다.

    그래서, 당신의 예에서 :: 목록입니다 오른쪽 피연산자의 방법이다.

  5. from https://stackoverflow.com/questions/2827293/scalas-operator-how-does-it-work by cc-by-sa and MIT license