2013-02-16 4 views
0

특정 메서드 서명을 가져 오는 방법이 있습니까?스칼라에서 특정 메서드 서명 가져 오기

def test() { 
    lazy val log = LoggerFactory.getLogger("AndroidProxy") 
    import log.{error, debug, info, trace} 

    trace("This is a test") 
    trace "This is also" // <- This line will not compile 
} 

아마 불가능하지만 내 기본 목표는 새로운 방법으로 추가하지 않고 이것을 허용하는 것입니다. 나는 이것을 쓸모 없게 시도했다.

import log.{error => error(_:String)} 
import log.{error(x: String) => error(x)} 

나는 모든 방법이 하나의 인수를 취한다고 가정한다.()없이 인자없는 메소드를 호출 할 수 있으며, 메소드 호출을 생략 할 수 있습니다. foo getX toString,하지만 자동으로 arity-1 전화를 만드는 방법을 모르겠다.

이것은 this question의 후속 조치입니다.

+1

그 줄 것이다 명백한 불법이기 때문에 컴파일하지 마십시오. 오류 메시지는 컴파일러가 아티팩트를 만들어내는 것일뿐입니다. 가져 오기와 해당 항목 사이의 빈 줄을 유지하면서 위의 줄을 제거하고 내용을 확인하십시오. –

+0

그래, 완전히 다른 오류입니다. 질문을 업데이트하겠습니다. – Hamy

답변

3

코드와 문제 :

trace "This is also" // <- This line will not compile 

당신이 어떻게 든 trace의 너무 많은 과부하 변형을 가져 오는하지- 그것은 당신이 스칼라의 중위 표기법이 방법을 사용할 수 있습니다. 같은 식 :

e.op 

그래서 코드가 해당 될 것이다 :

e op 

통화 동등한 "포스트 Fi를 X의 작동"합니다 (Scala Language Specification의 섹션 6.12.2 참조)로 해석됩니다 :

trace."This is also" 

물론 컴파일 오류입니다.

대신 양식 e1 op e2 (섹션 Scala Language Specification의 6.12.3)의 "인터넷에서 X 작동"을 사용하는 경우,이 방법은 오버로드 된 경우에도 문제가 없습니다 :

scala> class Logger { def trace(s: String) = "1arg"; def trace(i: Int, s: String) = "2arg" } 
defined class Logger 

scala> val log = new Logger 
log: Logger = [email protected] 

scala> log trace "This is also" 
res0: String = 1arg 
3

아니요, 특정 메소드 서명을 가져 오는 방법이 없습니다.

+3

정교하게 ... 가져 오기 란 이름에 관한 것입니다. 따라서 특정 서명 만 가져올 수는 없으며 주어진 이름에 대한 전체 오버로드 만 가져올 수 있습니다. –