복붙노트

[SCALA] 스칼라 : 방법 \ 연산자 오버로딩

SCALA

스칼라 : 방법 \ 연산자 오버로딩

다음은 책 '스칼라 프로그래밍'에서입니다. 클래스 '하여 Rational'다음과 같은 방법을 정의 감안할 때 :

def add(that: Rational): Rational =
    new Rational(
        this.numer * that.denom + that.numer * this.denom,
        this.denom * that.denom
    )

나는 성공적으로 지능 인수를 받아, 정의 이상을 사용한다 편의 버전으로 추가 메소드를 오버라이드 (override) 할 수 있습니다 :

def add(that: Int): Rational =
    add(new Rational(that, 1))

아니 문제까지.

지금, 나는이 연산자 스타일의 이름으로 메소드 이름을 변경하는 경우 :

def +(that: Rational): Rational =
    new Rational(
        this.numer * that.denom + that.numer * this.denom,
        this.denom * that.denom
    )

그리고 과부하 같은 :

def +(that: Int): Rational =
    +(new Rational(that, 1))

나는 다음과 같은 컴파일 오류가 발생합니다 :

(fragment of Rational.scala):19: error: value unary_+ is not a member of this.Rational
+(new Rational(that, 1))
 ^

왜 컴파일러는 + 방법의 단항 버전을 찾고?

해결법

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

    1.스칼라 타입 중 어느 구조에서 + X, -x, x 및 ~! X 이것이 부정 등의 데! B의 구 형상 자바 있도록 부분적 등 메소드 호출 x.unary_ +로 변환 부울 B 또는 개수 (X)의 부정과 같은 -x.

    스칼라 타입 중 어느 구조에서 + X, -x, x 및 ~! X 이것이 부정 등의 데! B의 구 형상 자바 있도록 부분적 등 메소드 호출 x.unary_ +로 변환 부울 B 또는 개수 (X)의 부정과 같은 -x.

    따라서 코드 + (새하여 Rational (1) 그)하여 Rational이 방법을 가지고 있지 않는로 번역 (새하여 Rational (즉, 1)). unary_ +가, 그리고, 당신은 컴파일 오류가 발생합니다. 또는, ~ - 당신은 당신의 함수, +라는 경우에만이 오류가 발생합니다! 이 같은 스칼라는 단항 연산자로 수있는 유일한 문자입니다. 당신이 당신의 함수를 호출하는 경우 예를 들어, @ + 코드는 잘 컴파일합니다.

    비록, 내가 같이 오버라이드 (override) 추가 기능을 작성하는 제안 :

    def +(that: Int): Rational =
      this + (new Rational(that, 1))
    

    더 나은 기능의 목적이 코드 쇼 - 당신은 이것에 분모로 분자와 1과 정수로 구성 새로운하여 Rational을 추가 할 수 있습니다. 글을 쓰는이 방법이로 번역됩니다 + (하여 Rational 새 (그 1)), 당신이 원하는이다 -.이에 + 함수를 호출.

    참고는 함수가 호출 될 그러나 중위 표기법을 사용할 수 있습니다. 추가 다시 이름을 변경하는 경우 예를 들어, 당신은 여전히 ​​정의로 유지할 수 있습니다 :

    def add(that: Int): Rational =
      this add (new Rational(that, 1))
    
  2. ==============================

    2.당신이 명시 적으로 이것에 +를 호출하는 경우, 그것을 작동합니다

    당신이 명시 적으로 이것에 +를 호출하는 경우, 그것을 작동합니다

    def +(that: Int): Rational = this.+(new Rational(that, 1))
    

    스칼라는 접두사 연산자 표기법에서 사용할 수있는 단항 연산자를 정의 할 수 있습니다. 예를 들어, 당신은 동일을 달성하기 위해 접두어 연산자 +를 사용할 수 있습니다 :

    def unary_+: Rational = this.+(new Rational(that, 1))
    val a = new Rational(3,2)
    val b = +a
    

    귀하의 예제에서이 명시 적없이, 컴파일러는 당신이 정의되지 않은 단항 연산자 +를 사용하고 있는지 생각합니다.

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

    3.당신은 당신이 단항 + 연산자를 지정한, 이진 + 연산자를 지정하지 않았습니다.

    당신은 당신이 단항 + 연산자를 지정한, 이진 + 연산자를 지정하지 않았습니다.

    그래서 대신 :

    def +(that: Int): Rational =
      +(new Rational(that, 1))
    

    이를 작성할 필요가 :

    def +(that: Int): Rational =
      this +(new Rational(that, 1))
    
  4. from https://stackoverflow.com/questions/1991240/scala-method-operator-overloading by cc-by-sa and MIT license