2011-11-20 5 views
7

以下の一般的なregisterメソッドが与えられた場合、:=演算子をシンボリックエイリアスとして定義したいと考えています。オペレータをScalaのメソッドエイリアスとして定義する最短の表記法は何ですか?

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

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

は、もともと私はこのような何か書きたかった:

val := = register _ 

をしかし、それは私の関数のシグネチャNothing => Nothingを与えます。私の次の試みは、タイプPropでそれをパラメータ化することでしたが、それはタイプパラメータを受け取り、それを前方に渡すことができるdefにする場合にのみ明らかに機能します。

@inline注釈を省略したいのは理想的ですが、Scalaコンパイラがどのようなオブジェクトコードを作成するかわかりません。

最も重要なの私の目標は、それが:=メソッドは名前以外registerメソッドのシグネチャのすべての部分を複製して、単純に前者と後者デリゲートを聞かせていないことです。

答えて

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

が有効です。

+0

シグネチャを複製したメソッド委任は、私が避けたがっているものです。私の最後のパラグラフ「最も重要なのは...」を参照してください。また、私は手動で引数を転送する必要はありません。 –

+0

@TimFriske残念なことに、あなたがこれをしたい場合、あなたはする必要があります。 –

1

Scalaの現在のところで達成していること(基本的にはaliasがRubyであなたに与えていること)があるとは思えません。 autoproxy pluginは、この種の問題に取り組もうとしていますが、コンパイラプラグインでコードを生成する際のさまざまな問題のために、まだ実稼働環境では使用できません。

1

あなたはこれを行うことができます:

def := : Prop => Prop = register 

だから、基本的に、ここであなただけの別の関数を参照するタイプ(プロップ=>プロップ)の関数を定義します。

関連する問題