2017-06-22 86 views
0

我想調試一個Scala程序(這是一個build.sbt,但問題不是特別針對sbt),我需要給某個特定的sbt設置一個部分函數。部分函數的值看起來像這樣捕獲部分函數的參數

{ 
    case Regex1(a,b,c) => 
    case Regex2(d,e,f) => 
    ... 
} 

部分函數沒有做我想做的,所以我想調試它。因爲我不確切知道傳入的內容,所以我想捕獲傳遞給部分函數的值,但我不知道該怎麼做。

我可以在部分函數的開頭添加一個case a => println(a),但是這打破了整個函數。

回答

2

你可以這樣做:

val print: PartialFunction[InputType, InputType] = { case i => println(i); i } 
print andThen { 
    case Regex1(a,b,c) => ... 
    case ... 
} 
+0

太棒了!正是我在找什麼!謝謝! –

0

我終於想出瞭如何去做。它不是很優雅,所以如果有人知道更好的方法,請添加另一個答案!

的解決方案是明確創建的部分功能值:

val result = new PartialFunction[InputType,ResultType] { 
    def apply(value: InputType) = { 
    println("input is: " + value) // Yay, I captured the value 
    value match { 
     // Same as above 
    } 
    } 
    def isDefinedAt(value: InputType) = true 
} 
result 
0

另一種選擇是,以匹配所有,並添加另一場比賽,做的實際工作:

{ 
    case value => { 
    println(value) 
    value match { 
     // the original partial function 
     ... 
     // you might need to add a catch-all that 
     // does nothing or returns a default value 
     case _ => None 
    } 
    } 
}