2013-10-24 86 views
1

斯卡拉初學者,在這裏。說實話,我完全被這整個表達所困惑。我隱約明白這應該做什麼,但是在做什麼?有人可以解釋這裏發生了什麼嗎?

val simple = { 
    get[String]("user.email") ~ 
    get[String]("user.name") ~ 
    get[String]("user.password") map { 
    case email~name~password => User(email, name, password) 
    } 
} 

Here's github源如果你好奇或需要更多的信息。

在此先感謝!

回答

1

是方法RowParser.~將兩個單獨的RowParsers組合爲單獨的列,給出結果RowParser [anorm。〜[Col1Type,Col2Type]]。這裏的處理細節:

  1. 辛格爾頓objectanorm.SqlParser有進口的所有成員。

  2. 它有一個方法get[T]

    def get[T](columnName: String)(implicit extractor: Column[T]): RowParser[T] 
    
    • 調用時,通用PARAM T被實例化爲String
    • 輸入PARAM columnName填充作爲"user.email"
    • 輸入PARAM extractorimplicit 。它不是在通話中提供的。因此,編譯器使用Column單例對象中的類型簽名匹配來獲取隱式值。它找到方法rowToString: Column[String]
    • 輸出PARAMS RowParser[T]被實例化RowParser[String]
  3. anorm.RowParser[String]具有方法 「~」 之稱。它的簽名是:

    def ~[B](p: RowParser[B]): RowParser[~[String, B]] 
    
  4. 但什麼是 「~」 輸入(參數P)?它在下一行:get[String]("user.name") ~

  5. 由於這種方法調用的 「鏈」,該方法調用順序實際上是自下而上:

    • 第一

      get[String]("user.password") map { 
          case email~name~password => User(email, name, password) 
      

      它返回類型RowParser[String]

    • 其被傳入

      get[String]("user.name") ~ 
      

      返回類型RowParser[~[String, String]]。在這裏,這使用了不同的「〜」 - 的anorm.~[A,B]其被定義爲的情況下類:

      case class ~[+A, +B](_1: A, _2: B) extends Product with Serializable 
      

      表示該行中conjoining 2分解析的列的結果。

    • 這RowParser通入:

      get[String]("user.email") ~ 
      

      它返回類型RowParser[~[String, RowParser[~[String, String]]]]

0

想通了。 '〜'是一行解析器組合器。它驗證user.emal,user.name,user.password的存在,其結果(如果成功)是可映射的〜[A,B,C]。在這種情況下,如果所有3都存在,則會創建並返回一個新的用戶對象。

相關問題