1

Scala初心者はこちら。正直なところ、この表現全体にかなり混乱しています。私はこれが何をするべきかを漠然と理解していますが、~s は何をしているのですか?

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

興味がある場合や詳細情報が必要な場合は、こちらのgithub ソースを参照してください。

前もって感謝します!

4

2 に答える 2

1

はい、メソッドRowParser.~は別々の列に対して 2 つの別々の RowParser を組み合わせて、結果 RowParser[anorm.~[Col1Type, Col2Type]] を与えます。処理の詳細は次のとおりです。

  1. シングルトンobject anorm.SqlParserにはすべてのメンバーがインポートされています。

  2. メソッドがありますget[T]

    def get[T](columnName: String)(implicit extractor: Column[T]): RowParser[T] 
    
    • 呼び出されると、ジェネリック パラメータTは次のようにインスタンス化されます。String
    • 入力パラメーターcolumnName"user.email"、などとして入力されます
    • 入力パラメータextractorimplicit. 通話では提供されません。Columnそのため、コンパイラはシングルトン オブジェクト内の型シグネチャ マッチングを使用して暗黙的な値を取得します。method を見つけますrowToString: Column[String]
    • 出力パラメーター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") ~
      

      type を返しますRowParser[~[String, String]]。ここでは、これは別の "~" を使用しています -ケースクラスとして定義されているタイプ: anorm.~[A,B]

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

      行内の 2 つの解析済み列を結合した結果を表します。

    • この RowParser は以下に渡されます。

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

      タイプを返すRowParser[~[String, RowParser[~[String, String]]]]

于 2013-10-25T07:04:40.307 に答える
0

理解した。'~' は、行を操作するパーサー コンビネーターです。これは、user.emal、user.name、user.password の存在を検証し、その結果 (成功した場合) は、マップ可能な ~[A, B, C] になります。この場合、3 つすべてが存在する場合、新しい User オブジェクトが作成されて返されます。

于 2013-10-24T03:39:29.293 に答える