1

さまざまな html パーツを独自のクラスに分割したいのですが、このコードに関する 1 つのことがわかりません (-snippet):

val z = for(a <- 0 to 5) yield div(s"$a")
body(h1("Testing stuff"), z)

うまく動作します。

以下も同様です。

body(h1("Testing stuff"), test)
private def test = for(a <- 0 to 5) yield div(s"$a")

うまくいかないのはこれです:

class Test[Builder, Output <: FragT, FragT](val bundle: scalatags.generic.Bundle[Builder, Output, FragT])
{
    import bundle.all._

    def render = for(a <- 0 to 5) yield div(s"$a")
}

val test = new Test(scalatags.Text)
body(h1("Testing stuff"), test.render)

これはコンパイルされません。それは言う(h1()が削除されると)

{quote} タイプの不一致、予想: Modifier[Builder]、実際: IndexedSeq[test.bundle.all.Div.Self] {quote}

そして、私はその理由を理解していません。暗黙の魔法が起こっていますか?私を啓発し、それがどのように行われたかを教えてもらえますか?

編集:

私のコードと @Owen のコードの違いをさらに明確にするには:

他のクラス( new を初期化する場所Test)でも importbundle.all.all_を行いました(同じベースから派生)が、 import は行いませんでしscalatags.Text.all._た。したがって、2 番目のパッケージには、変換を処理する暗黙の関数がいくつかあるようです。(まだ見つけていませんが。)

また、これがバンドルとしてimport bundle.all._渡す場合と同じではないことも非常に面白いと思います。scalatags.Text

4

1 に答える 1

1

あなたのコードは私にとってはうまくコンパイルされます。コンパイルした完全なコードは次のとおりです。

object TagTest1 {
  class Test[Builder, Output <: FragT, FragT](val bundle: scalatags.generic.Bundle[Builder, Output, FragT]) {
    import bundle.all._

    def render = for(a <- 0 to 5) yield div(s"$a")
  }

  {
    import scalatags.Text.all._

    val test = new Test(scalatags.Text)
    body(h1("Testing stuff"), test.render)
  }
}

編集:今日もこのエラーに遭遇し、グーグルで検索したところ、この質問が見つかりました。:)

それが誰かを助ける場合に備えて、私はそれ以来次のことを学びました:

暗黙のデバッグ

あなたのに次を入れてくださいbuild.sbt

scalacOptions ++= Seq(
  "-Xprint:typer"
)

-Yprint:typer削除されたようです)。

この特定の暗黙の

に基づいて、別の要素で要素の-Xprint:typera を使用するために必要な暗黙的な要素は であると判断しました。Seqscalatags.Text.all.SeqFrag

于 2016-07-10T20:47:09.280 に答える