1

スプレー初心者です。私は、Python、JQueryなどのいくつかの(私にとっては)奇妙なプログラミング言語を扱ってきました...それらを使用すると、少なくとも一部のコードセグメントが何をするかを理解できました。残念ながらSprayでは、簡単なコードすら読んで理解できません。

次の単純なコードブロックを読むのを手伝ってくれませんか(コードが何をするのかを言葉で説明してください)。

注:私が知っている非常に高レベルの、これは url パラメーターを選択し、それらを一緒に追加します。しかし、私が望むのは、他の誰かに教えることができるように、このコード ブロックのクリスタルを明確に理解することです。HNil, Directive1, Directive1, ::私にとって奇妙なものがあります。

val twoIntParameters: Directive[Int :: Int :: HNil] =
  parameters('a.as[Int], 'b.as[Int])

val myDirective: Directive1[String] =
  twoIntParameters.hmap {
    case a :: b :: HNil => (a + b).toString
  }

// test `myDirective` using the testkit DSL
Get("/?a=2&b=5") ~> myDirective(x => complete(x)) ~> check {
  responseAs[String] === "7"
}
4

2 に答える 2

3

スプレー ルーティングは、 の概念に基づいて構築されていDirectiveます。

Directiveは、HTTP 要求に対する変換と考えることができます。

ディレクティブに関連付けられたカーディナリティは、変換の実行後に変換チェーンに渡される引数の数です。

Directive0引数を提供 (または抽出) しないディレクティブです。

Directive1[A]type の引数を 1 つ提供しますA

Directive[A :: B :: HNil]A型andの 2 つの引数を提供Bします。より正確には、Aand で構成される異種リストを提供しますB(実装は形状のないHListです)。

コードの例を見てみましょう

val twoIntParameters: Directive[Int :: Int :: HNil] =
  parameters('a.as[Int], 'b.as[Int])

HTTP リクエストから 2 つの整数を抽出する、つまり type を持つ新しいディレクティブを定義していますDirective[Int :: Int :: HNil]。実装は、スプレーによってすでに提供されているディレクティブ、つまりparameters. parametersは、HTTP リクエストからクエリ パラメータを抽出し、特定のタイプに変換できるようにするディレクティブです。この場合Intは、両方のパラメータです。

val myDirective: Directive1[String] =
  twoIntParameters.hmap {
    case a :: b :: HNil => (a + b).toString
  }

myDirectivetype の 1 つのパラメーターを抽出するディレクティブですString

その実装は、以前に定義されたtwoIntParametersディレクティブを使用し、その結果にマップして、変換を適用します。この場合、2 つの を取り、Intそれらを合計して、結果を に変換しStringます。

それで、何hmapですか?これは、 shapeless を返すディレクティブを操作するスプレーによって提供される方法にすぎませんHListhmapこの場合HListString.

HLists は、通常の scala と同じようにパターン マッチすることができList、それが例で見られるものです。

最後に、これはディレクティブが機能的な観点からどのように機能するかについての単なるアイデアです。DSL 構文の詳細を理解したい場合は、もう少し掘り下げて、Magnet Patternについて読む必要があります。

于 2015-09-16T12:29:43.453 に答える