2011-11-20 3 views
7

아래의 일반 register 메서드를 사용하면 := 연산자를 기호 별칭으로 정의하고 싶습니다. 스칼라에서 연산자를 메서드 별칭으로 정의하는 가장 짧은 표기법은 무엇입니까?

def register[Prop <: Property[_]](prop: Prop): Prop 

@inline 
final def :=[Prop <: Property[_]] = register[Prop] _ 

원래 나는 이런 식으로 뭔가 쓰고 싶다 :

val := = register _ 

를하지만 나에게 함수 서명 Nothing => Nothing을 제공합니다. 내 다음 시도는 유형 Prop으로 매개 변수화하는 것이었지만 유형 매개 변수를 사용하고 이후에 전달할 수있는 def으로 만들면 분명히 작동합니다.

이상적으로는 @inline 주석을 생략하고 싶지만 스칼라 컴파일러가 어떤 객체 코드를 작성하는지 잘 모르겠습니다.

에서 가장 중요한 역할을 한 내 목표는이 := 방법은 이름을 제외하고 register 방법의 서명의 모든 부분을 복제하고 단순히 후자에 대한 전 대표를 할 수있는 것이 아니다.

답변

2
def :=[Prop <: Property[_]](prop: Prop) = register(prop) 

.

+0

중복 서명을 사용하는 메소드 위임은 내가 피하고 싶었던 것입니다. 마지막 단락 인 "가장 중요하게 생각하는 것 ..."을보십시오. 또한 수동으로 인수를 전달하지 않아도됩니다. –

+0

@TimFriske 불행히도, 당신이 이것을 원한다면해야 할 것입니다. –

1

저는 현재 스카라에서 여러분이 무엇을했는지 (기본적으로는 alias이 Ruby에서 무엇을 제공하는지)를 달성 할 수있는 방법이 없다고 생각합니다. autoproxy plugin은 이러한 종류의 문제를 해결하기위한 시도이지만 컴파일러 플러그인에서 코드를 생성 할 때 발생하는 다양한 문제로 인해 아직 프로덕션 용으로 사용할 준비가되지 않았습니다.

1

이 작업을 수행 할 수 있습니다

그래서 기본적으로 여기
def := : Prop => Prop = register 

당신은 또 다른 함수를 참조 유형의 기능 (소유 => 소유)를 정의합니다.

관련 문제