가정하자 나는 유형 A
, B
및 C
, 그리고 오버로드 방법이 있습니다포장 과부하 기능
def foo(a: A): C
def foo(b: B): C
다음
나는 작동 코드 (복잡한) 조각이 가정을 유형은 C
입니다. 내가하고 싶은 것은 두 유형 A
또는 B
취하는 방법이다 : 나는 bar
의 두 가지 버전을 쓸 수 물론
def bar(x: [A or B]) = {
val c = foo(x)
// Code that works with c
}
를, 유형 A
및 B
를 취할 과부하하지만,이 경우, 여러가 bar
처럼 동작하는 함수들, 그리고 과부하 된 버전을 가진 바보가 될 것입니다. (실제 경우에는 foo
의 세 가지 버전이 있습니다).
C 스타일 매크로가 여기에 완벽 할 것이므로 Scala 매크로를 살펴 보았습니다. 어색한 부분은 스칼라 매크로는 여전히 입력 - 선택되어 있는지, 그래서 컴파일러가 사전에 x
의 유형을 알고 싶어하기 때문에 난 그냥
reify(foo(x.splice))
을 말할 수 없습니다. 필자는 스칼라 매크로를 처음 사용하는 것에 대해 새롭다 (그리고 그것은 실질적인 API이다).
매크로없이이 코드를 레이아웃하는 방법이 있다면 도움이 될 것입니다.
매크로를 사용하면이 작업을 수행 할 수 있지만, 실제로는 그리 좋은 생각이 아닙니다. (그리고 나는 스칼라의 매크로 시스템의 팬입니다.) 대신 형식 클래스를 사용하십시오. –
네, 타입 클래스는 깔끔한 아이디어입니다. 그래도 매크로로 할 수있는 방법이 있다면 (교육적 목적으로) 궁금합니다. 가능한 것처럼 보입니다. – geoffliu