2013-10-24 158 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都存在,则会创建并返回一个新的用户对象。

相关问题