2016-08-01 62 views
0

我試圖檢測方法定義中的名稱參數。我的方法是基於this question'sByNameParam解決方案。反射不正確地匹配名字參數

不幸的是,名稱參數與重複參數的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 
    } 
} 

斯卡拉版本:2.11.4(OpenJDK的64位服務器VM,爪哇1.8.0_65)

回答

1

當你使用像TypeRef(_, byNameDefinition, args)模式,byNameDefinition是一個新的變量,而不是與你現有的比較val byNameDefinition。由於該變量未被使用,因此它與TypeRef(_, _, args)的效果相同。爲了避免這種情況,你需要用反引號包圍它或者以大寫字母開頭來命名它。

+0

這固定了它。謝謝! –