2

宿題 としてタグ付けされました。クラスを実装しようとしているときに、オブジェクト指向の世界で問題が発生しています。

セットをモックするために使用しているリストに対してアクションを実行するためのさまざまな関数を実装しています。たとえば、結合を見つける方法についての論理についてはあまり心配していませんが、実際には構造だけです。

例:

abstract class parentSet[T] protected () {

    def union(other:parentSet[T]):parentSet[T]

}

ここで、parentSet を拡張する新しいクラスが必要です。

class childSet[T] private (l: List[T]) extends parentSet[T] {
    def this() = this(List())
    private val elems = l
    val toList = List[T] => new List(l)

    def union(other:parentSet[T]):childSet[T] = {
        for (i <- this.toList) {
            if (other contains i) {}
            else {l :: i}
        }
        return l
    }
}

コンパイル時に、型 childSet が def union に見つからない、または型 T をパラメトリックに保持できないなどのエラーを受け取ります。また、オブジェクトのメンバーではないことを訴えているため、toList は正しくないと思います。いくつか挙げると。

構文のどこが間違っていますか?

編集

今、私はそれを理解しました:

  def U(other:parentSet[T]):childSet[T] = {
    var w = other.toList
    for (i <- this.toList) {
        if (!(other contains i)) {w = i::w}
    }
    return new childSet(w)

}

今、私はマップで同じ操作をしようとしています.これは私が取り組んでいるものです:

def U(other:parentSet[T]):MapSet[T] =  {
    var a = Map[T,Unit]
    for (i <- this.toList) {
        if (!(other contains i)) {a = a + (i->())}
    }
    return new MapSet(elems + (a->()))
  }

私はまだ toList を使用して簡単にトラバースできるようにしたいのですが、マップをいじっているときにまだ型エラーが発生しています..

4

2 に答える 2

2

このコードにはいくつかの問題があります。

それがList[T]不変の型であることを認識していないようです。つまり、一度作成された値を変更することはできません。したがって、 がありList[T]、メソッドを呼び出して::値を追加すると、関数は新しいリストを返し、既存のリストは変更されません。Scala にはListBuffer、期待どおりに動作するような変更可能なコレクションがあります。したがって、return l実際には元のリストを返しています。

また、使用する順序が間違ってい::ます。は右バインディング関数であるため ( で終わるため) i :: l、に移動する必要があります。:::

最後に、ユニオン メソッドで実行している(other contains i). 混乱させているのは単に Scala の構文だけかもしれませんが、これは行うことと同じで(other.contains(i))あり、明らかにcontainsの定義済みメソッドではありませんparentSet。これは型のメソッドですが、リストList[T]を呼び出していません。contains

あなたはこれを宿題としてタグ付けしたので、コードを修正するつもりはありませんが、すべきだと思います

  1. リストを含む正しい Scala コードの例をいくつか見てください。まずはこちらを試してください。

  2. Scala REPL をいじって、いくつかのリストを作成して操作してみてください。そうすれば、不変コレクションがどのように機能するかを感じることができます。

于 2012-10-02T18:46:43.720 に答える
1

直接の質問に答えるには、childSetがparentSetを継承している場合でも、元のメソッドは、childSetではなくparentSetを戻り型として指定します。タイプとしてparentSetのみを使用するか、戻りタイプをparentSetを継承するものに指定することができます。

于 2012-10-02T21:14:53.433 に答える