2013-04-11 59 views
1

這裏應該有一些簡單的東西,儘管我完全忽略它,因爲我是Scala和Play的noob。下面的代碼:爲Scala和Anorm玩:不能創建簡單的解析器

case class ExceptionInfo(ExceptionType: String, Message: String, StackTrace: Seq[String]) 

object ExceptionInfo 
    { 
     val excInfoParser = { 
     get[String]("ExceptionInfo.ExceptionType") ~ 
     get[String]("Message") ~ 
     get[String]("ExceptionInfo.StackTrace") map { 
      case ExceptionType ~ Message ~ StackTrace => ExceptionInfo(ExceptionType, Message, StackTrace.split("\r\n")) 
     } 
     } 
    } 

這不能編譯,與下面的輸出:

Description Resource   Path    Location      Type 
not found: value ExceptionType Application.scala /testme/app/controllers line 40 Scala Problem 
not found: value Message  Application.scala /testme/app/controllers line 40 Scala Problem 
not found: value StackTrace  Application.scala /testme/app/controllers line 40 Scala Problem 
not found: value ExceptionType Application.scala /testme/app/controllers line 40 Scala Problem 

提前感謝!

回答

2

應工作時使用小寫命名變量:

case exceptionType ~ message ~ stackTrace => ExceptionInfo(exceptionType, message, stackTrace.split("\r\n")) 

小寫是什麼區別綁定到變量和常量(你在找什麼)對要匹配。有關更多信息,請參閱herehere

+0

嗨,謝謝你的回答。所以所有的case變量(在=>的左邊)都必須用小寫來命名?這是否也適用於'get [String](「ExceptionInfo.ExceptionType」)'?我的意思是,我應該將它重命名爲'get [String](「ExceptionInfo.exceptionType」)?或者Anorm如何匹配字符串和那些大小寫變量? – Haspemulator 2013-04-12 08:44:47

+0

正確,個案變量需要以小寫字母開頭。最好遵守一個命名約定,並且在Scala中它使用camelCase命名字段。就數據庫領域而言,它具有更大的靈活性:取決於您的名稱。 Anorm只關心類型([String],[Int]等)和順序(用「〜」)。 – 2013-04-12 13:01:10