2012-08-03 2 views
8

私の仕事は、デフォルト値があるケースクラスのパラメータの名前を見つけることです。 2.9ではスカラーリフレクションを使用してケースクラスのどのパラメータがデフォルト値を持つかを確認する方法2.10

私はscalapからScalaSigParserを使用していたとのようなものでした:私は2.10にその反射を期待していたことは私にこの種の情報に簡単にアクセスを与えるだろう

(...) 
case x: MethodSymbol if x.name.startsWith("init$default$") => (...) 
(...) 

を。

最終的に、ケースクラスのコンパニオンオブジェクトに含めるマクロを記述したいと思います。コンパニオンオブジェクトは、そのケースクラスの直列化/逆シリアル化のコードを自動的に作成します。そのためには、どのパラメータにデフォルト値があるかを知る必要があります。

答えて

3

私はちょうどそれを行う方法はありませんが、私はちょうど要求された機能を公開するTermSymbol.isDefaultParamを追加するプル要求(https://github.com/scala/scala/pull/1047)を提出しました。私はそれがRC1と2.10.0-finalになることを願っています。

scala> case class C(x: Int, y: Int = 2) 
defined class C 

scala> val ctor = typeOf[C].declaration(nme.CONSTRUCTOR).asMethod 
ctor @ 39fe9830: reflect.runtime.universe.MethodSymbol = constructor C 

scala> ctor.params.flatten filter (_.asTerm.isDefaultParam) 
res0 @ 7ad2093b: List[reflect.runtime.universe.Symbol] = List(value y) 
+0

大変感謝! –

+0

プルリクエストが完全にマージされており、それは2.10.0に含まれます。 –

+1

'params'は' paramss'で、 'isDefaultParam'メソッドはscala 2.10と2.11の両方で' isParamWithDefault'に名前が変更されました – lyomi

関連する問題