Какое самое короткое обозначение, чтобы определить оператор как псевдоним метода в Scala? - PullRequest
7 голосов
/ 21 ноября 2011

Учитывая приведенный ниже обобщенный метод register, я бы хотел определить оператор := как символический псевдоним.

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

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

Изначально я хотел написать что-то вроде этого:

val := = register _

Но это дает мне сигнатуру функции Nothing => Nothing. Моя следующая попытка была параметризовать его с типом Prop, но это, очевидно, работает, только если я сделаю его def, который может принимать параметры типа и передавать их дальше.

В идеале я хотел бы опустить аннотацию @inline, но я не уверен, какой объектный код делает из нее компилятор Scala.

Самое важное моя цель состоит в том, чтобы метод := не дублировал все части сигнатуры register метода, кроме имени, а затем просто позволил бы первому делегату последнему.

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011
def :=[Prop <: Property[_]](prop: Prop) = register(prop)

должно работать.

1 голос
/ 27 сентября 2017

Вы можете сделать это:

def := : Prop => Prop = register

Итак, в основном, здесь вы определяете функцию типа (Prop => Prop), которая просто ссылается на другую функцию.

1 голос
/ 21 ноября 2011

Я не верю, что есть какой-либо способ достичь того, что вам нужно (в основном то, что alias дает вам в Ruby) в Scala в его нынешнем виде.Плагин autoproxy является попыткой решения этой проблемы, но он еще не готов к производственному использованию из-за различных проблем с генерацией кода в плагинах компилятора.

...