Scala의 apply () 메서드 매직은 어떻게 작동합니까?


79

Scala apply에서 클래스 나 최상위 객체에서 호출되는 메서드를 정의하면 해당 클래스의 인스턴스에 괄호 쌍을 추가하고 그 apply()사이에 적절한 인수를 넣을 때마다 해당 메서드가 호출 됩니다. 예를 들면 :

class Foo(x: Int) {
    def apply(y: Int) = {
        x*x + y*y
    }
}

val f = new Foo(3)
f(4)   // returns 25

그러니까 기본적으로, object(args)단지 문법 설탕입니다 object.apply(args).

Scala는이 변환을 어떻게 수행합니까?

Predef 개체의 암시 적 형식 변환과 비슷하지만 종류가 다른 전역 정의 암시 적 변환이 여기에서 진행되고 있습니까? 아니면 더 깊은 마법인가요? 나는 Scala가 많은 예외를 가진 많은 규칙보다 더 작은 규칙 세트의 일관된 적용을 강력하게 선호하는 것처럼 보이기 때문에 묻습니다. 이것은 처음에는 나에게 예외처럼 보입니다.


답변:


67

나는 아무것도에가는 깊이 생각하지 않는 것보다 원래 말한 : 그냥 문법 설탕의 이에 컴파일러 변환 f(a)f.apply(a)특별한 문법의 경우와.

이것은 특정 규칙처럼 보일 수 있지만 이들 중 일부 (예 :) 만이 DSL 과 유사한 구조 및 라이브러리를 update허용합니다 .


4
"언제 f객체 (함수 포함)"를 추가합니다. f방법이 언제 인지 분명히 그러한 번역이 없습니다.
Alexey Romanov

2
@AlexeyRomanov : 음, 만약 f매개 변수 목록없이 정의 된 메소드라면 f(a)실제로 val _tmp = f; _tmp.apply(a). 그러나 그것은 실제로 머리카락 분할 영역으로 확고하게 들어가고 있습니다.
Jörg W Mittag 2014

20

실제로는 반대로 적용 메서드가있는 개체 또는 클래스가 일반적인 경우이고 함수는 적용 메서드를 사용하여 동일한 이름의 개체를 암시 적으로 구성하는 방법입니다. 실제로 정의하는 모든 함수는 Function n 특성 의 하위 객체입니다 (n은 인수 수).

주제에 대한 자세한 내용은 섹션 6.6 : Scala 언어 사양함수 응용 프로그램 을 참조하십시오 .


Scala 언어 사양 변경에 +1. 페이지 번호가 오래되었으므로 올바른 위치를 추가했습니다.
Alexandre Martins

8

나는 Scala가 많은 예외를 가진 많은 규칙보다 더 작은 규칙 세트의 일관된 적용을 강력하게 선호하는 것처럼 보이기 때문에 묻습니다.

예. 그리고이 규칙은이 작은 집합에 속합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.