2016-08-01 4 views
0

メソッド定義内のby-nameパラメータを検出しようとしています。私のアプローチはthis question'sByNameParamの解決策に基づいています。リフレクションが名前のパラメータで不適切に一致しています

反復引数の場合、by-nameパラメータはTypeRefに一致し、逆も同様です。例については、下のコードを参照してください。

これは意図した動作ではないと仮定します。問題が終了しましたか、Definitionsモジュールに問題がありますか?

import scala.reflect.runtime.universe._ 

class X { def x(i: => Int, other: Int*) = i * 2 } 

val typeSignature = typeOf[X].member(TermName("x")).typeSignature 
val paramTypes = typeSignature match { 
    case MethodType(params, _) => params map { _.typeSignature } 
} 
val repeatedParamDefinition = definitions.RepeatedParamClass 
val byNameDefinition = definitions.ByNameParamClass 

// prints "Got repeatedParamDefinition" twice 
paramTypes map { signature => 
    signature match { 
    case TypeRef(_, repeatedParamDefinition, args) => 
     println("Got repeatedParamDefinition") 
     args 
    case TypeRef(_, byNameDefinition, args) => 
     println("Got byNameDefinition") 
     args 
    } 
} 

// Prints "Got byNameDefinition" twice 
paramTypes map { signature => 
    signature match { 
    case TypeRef(_, byNameDefinition, args) => 
     println("Got byNameDefinition") 
     args 
    case TypeRef(_, repeatedParamDefinition, args) => 
     println("Got repeatedParamDefinition") 
     args 
    } 
} 

Scalaのバージョン:2.11.4(OpenJDKの64ビットサーバーVMはJava 1.8.0_65)

答えて

1

あなたはTypeRef(_, byNameDefinition, args)のようなパターンを使用し、byNameDefinitionは新鮮な変数ではなく、あなたが既存との比較でありますval byNameDefinition。その変数は使用されていないので、実質的にはTypeRef(_, _, args)と同じです。これを避けるには、バッククォートで囲むか、大文字で始まる名前を付ける必要があります。

+0

これは修正されました。ありがとう! –

関連する問題