1

Martin Odersky による本 Programming in Scala (second edition) を読んでいますが、第 10 章の例に問題があります。

これは、章のほぼ最後にある私のファイルです。

class Element
object Element {

  private class ArrayElement(
    val contents: Array[String]
  ) extends Element

  private class LineElement(s: String) extends ArrayElement(Array(s)) {
    override def width = s.length
    override def height = 1
  }

  private class UniformElement(
    ch: Char,
    override val width: Int,
    override val height: Int
  ) extends Element {
    private val line = ch.toString * width
    def contents = Array.fill(height)(line)
  }

  def elem(contents: Array[String]): Element =
    new ArrayElement(contents)

  def elem(chr: Char, width: Int, height: Int): Element =
    new UniformElement(chr, width, height)

  def elem(line: String): Element = 
    new LineElement(line)

}

abstract class Element {
  def contents: Array[String]

  def width: Int = 
    if (height == 0) 0 else contents(0).length

  def height: Int = contents.length

  def above(that: Element): Element =
    elem(this.contents ++ that.contents)

  def beside(that: Element): Element =
    elem(
      for (
        (line1, line2) <- this.contents zip that.contents
      ) yield line1 + line2
    )
}

コンパイラは次のように言っています。

defined class Element
<console>:15: error: method width overrides nothing
           override def width = s.length
                        ^
<console>:16: error: method height overrides nothing
           override def height = 1
                        ^
<console>:21: error: value width overrides nothing
           override val width: Int,
                        ^
<console>:22: error: value height overrides nothing
           override val height: Int
                        ^
<console>:17: error: not found: value elem
           elem(this.contents ++ that.contents)
           ^
<console>:20: error: not found: value elem
           elem(
           ^

を最初から削除するclass Elementと、サブクラス化しようとすると Element タイプが見つからないというエラーが表示されます。

ここで、本のこの章について既に議論しているいくつかのトピックを見つけましたが、そこで提案された解決策を使用できませんでした。

私は何を取りこぼしたか?

よろしく、ノーバート

4

2 に答える 2

5

最初に、クラス Element を 2 回宣言します。最初の行を削除します。混乱を招くだけです (これはエラーの原因ではありません。エラーが発生した場合は、エラーに関する詳細情報を教えてください。) これにより、オーバーライド エラーが修正されます。次に、コンパニオン オブジェクトのメソッドelemは、クラスで自動的に表示されません。使用する場所に接頭辞を付けるかElement、クラスの先頭に import 行を追加することをお勧めします。

object Element {
  ...
}

abstract class Element {
  import Element._
  ...
}

編集: ああ、最初の行を省略したときにエラーが発生する理由がわかるかもしれません。REPL でこれを試して、一度に 1 行 (または 1 つの宣言) ずつ入力すると、REPL が必要な前方参照を好まないため、この問題が発生する可能性があります。一度にすべてのコードを貼り付けてみてください (REPL で ":paste" を使用)。

于 2013-08-19T21:50:07.767 に答える