3

しばらく Scala を使用し、あちこち、特にここについて読んだ後

カーリーをいつ使うべきか知っていると確信していました。経験則として、実行するコードのブロックを渡したい場合は、中括弧を使用します。

中括弧を使用したelastic4s DSLを使用して、この厄介なバグがどのように表面化したか:

bool {
  should {
    matchQuery("title", title)
  }
  must {
    termQuery("tags", category)
  }
}

コンパイルすると:

{
  "bool" : {
    "must" : {
      "term" : {
        "tags" : "tech"
      }
    }
  }
}

括弧を使用している間:

bool {
       should (
         matchQuery("title", title)
        ) must (
         termQuery("tags", category)
        )
      }

正しい結果が得られます:

{
  "bool" : {
    "must" : {
      "term" : {
        "tags" : "tech"
      }
    },
    "should" : {
      "match" : {
        "title" : {
          "query" : "fake",
          "type" : "boolean"
        }
      }
    }
  }
}

これはscala 2.11.6を使用してコンパイルされました-さらに混乱するのは、intellijデバッガーで式を評価すると、使用しているものに関係なく正しい結果が得られることです。

最後の式だけが評価されていることに気付きました。なぜですか?

4

1 に答える 1

8

おそらく中括弧ではなく、中置表記の問題です。線を見て

  should {
    matchQuery("title", title)
  }
  must {

mustは次の行に移動するため、新しい式として解釈されますが、の継続としては解釈されませんshould。おそらく閉じ中括弧と同じ行に配置する必要があります

  should {
    matchQuery("title", title)
  } must {
于 2015-04-26T14:33:17.760 に答える