2011-11-20 8 views
7

Biorąc pod uwagę ogólną metodę register poniżej, chciałbym zdefiniować operatora := jako symboliczny alias.Jaka jest najkrótsza notacja, aby zdefiniować operatora jako alias metody w Scali?

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

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

Początkowo chciałem napisać coś takiego:

val := = register _ 

Ale to daje mi podpisu funkcji Nothing => Nothing. Moją kolejną próbą było sparametryzowanie go na typ Prop, ale najwyraźniej działa tylko wtedy, gdy zrobię to jako def, który może przyjmować parametry typu i przekazywać je dalej.

Idealnie chciałbym pominąć adnotację @inline, ale nie jestem pewien, jaki kod obiektowy wykonuje z niego kompilator Scala.

Najważniejszym moim celem jest to, aby nie mieć metoda := powielać wszystkie części podpisu register metody badaniem z wyjątkiem nazwy, a następnie po prostu niech byłego delegata do ostatniego.

Odpowiedz

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

powinien działać.

+0

Przekazywanie metod z powielonymi podpisami jest dokładnie tym, czego chciałem uniknąć. Zobacz mój ostatni akapit "Najważniejsze ...". Również nie chcę ręcznie przekazywać żadnych argumentów. –

+0

@TimFriske Niestety, będziesz musiał, jeśli chcesz to zrobić. –

1

Nie wierzę, że jest jakikolwiek sposób na osiągnięcie tego, o co prosisz (w zasadzie to, co alias daje ci w Ruby) w Scali w obecnym stanie. The autoproxy plugin jest próbą rozwiązania tego rodzaju problemu, ale nie jest jeszcze gotowy do użycia w produkcji z powodu różnych problemów z generowaniem kodu w wtyczkach kompilatora.

1

Można to zrobić:

def := : Prop => Prop = register 

Więc w zasadzie tutaj zdefiniować funkcję typu (prop => boczna), że po prostu odwołuje inną funkcję.

Powiązane problemy