[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.스칼라 타입 중 어느 구조에서 + 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.당신이 명시 적으로 이것에 +를 호출하는 경우, 그것을 작동합니다
당신이 명시 적으로 이것에 +를 호출하는 경우, 그것을 작동합니다
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.당신은 당신이 단항 + 연산자를 지정한, 이진 + 연산자를 지정하지 않았습니다.
당신은 당신이 단항 + 연산자를 지정한, 이진 + 연산자를 지정하지 않았습니다.
그래서 대신 :
def +(that: Int): Rational = +(new Rational(that, 1))
이를 작성할 필요가 :
def +(that: Int): Rational = this +(new Rational(that, 1))
from https://stackoverflow.com/questions/1991240/scala-method-operator-overloading by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 다중 프로젝트 빌드에 대한 테스트의 병렬 실행을 해제하려면? (0) | 2019.11.28 |
---|---|
[SCALA] 스칼라의 존재 유형의 예에 의한 자바의 와일드 카드의 차이? (0) | 2019.11.28 |
[SCALA] 프레임 워크를 재생 - JSON 객체에 필드를 추가 (0) | 2019.11.28 |
[SCALA] 무엇을 Predef.locally 수행 방법 Predef.identity에서 그 차이가 않습니다 (0) | 2019.11.27 |
[SCALA] 스칼라 컬렉션을 변경할 수 대에 불변 (0) | 2019.11.27 |