2016-08-01 8 views
0

Ich versuche, By-Name-Parameter in einer Methodendefinition zu erkennen. Mein Ansatz basiert auf this question'sByNameParam Lösung.Reflection stimmt nicht korrekt mit Parametern von Name überein

Leider stimmen die Namensparameter bei wiederholten Argumenten mit TypeRef s überein, und umgekehrt. Im folgenden Code finden Sie ein Beispiel.

Ich nehme an, dass dies nicht das beabsichtigte Verhalten ist. Ist der Fehler an meinem Ende oder gibt es ein Problem mit dem Definitions Modul?

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 Version: 2.11.4 (OpenJDK 64-Bit Server VM, Java 1.8.0_65)

Antwort

1

Wenn Sie ein Muster wie TypeRef(_, byNameDefinition, args) verwenden, ist byNameDefinition eine neue Variable, kein Vergleich mit Ihrer vorhandenen val byNameDefinition. Da diese Variable nicht verwendet wird, entspricht sie effektiv TypeRef(_, _, args). Um dies zu vermeiden, müssen Sie es mit Backticks umgeben oder mit einem Großbuchstaben beginnen.

+0

Dies wurde behoben. Vielen Dank! –