-3

このコードについて助けが必要です。

object test {
  var list : Vector[MyType] = null
}

object foo extends MyType { // Mytype is a trait
    println("TEST ")
    test.list.:+(foo)
    def myfunc() { //need to define this as this is there in the trait
       // i do some operations
     } 
  }


object Bar extends MyType { // Mytype is a trait
    println("TEST ")
    test.list.:+(Bar)
    def myfunc(){
      // i do some operations
    } 
  }

ここで、リストを調べて、MyType を拡張しているすべてのオブジェクトに対して myfunc() を呼び出したいと思います。

test.list foreach( t2 => t2.myfunc() )

値がリストに追加されていません。誰かが私が間違っていることを教えてもらえますか? 動いていない。その印刷ステートメントを機能させる方法はありますか?

4

2 に答える 2

2

問題は、オブジェクトがクラスとして構築されていないため、コードが自動的に呼び出されることです。あなたは2つのことをすることができます。拡張Appして呼び出すmainか、関数を記述します。

trait X

object test {
  var list = Vector.empty[X]
}

object Foo extends App with X {
  test.list :+= Foo
  override def toString() = "Foo"
}

object Bar extends X {
  def add() {
    test.list :+= Bar
  }
  override def toString() = "Bar"
}

Foo.main(null)
Bar.add()
test.list foreach println

このコードは次のように出力します。

Foo
Bar

アプリを拡張すると、オブジェクトにすべてのコードを含むメインメソッドのみがオブジェクトに追加されます。

于 2012-08-08T06:22:29.743 に答える
2

ではなく空のベクターでテストを初期化する必要がありますnull。Scala でこれを行う方法は、Vectorオブジェクトからファクトリ メソッドを使用し、型推論にその仕事をさせることです。例えば:

var list = Vector.empty[MyType]

これを実践すると、データの型を宣言するよりも、データを作成することに集中できるようになります。この場合、エラーが発生する前に解決できます。

次に操作

test.list.:+(foo)

は不変でtest.listあるためVector、このメソッドは新しく更新されたコピーを返すだけで、 の参照に影響を与えることができないため、 は更新されませんlist

代わりに試す

test.list = test.list.:+(foo)
// or (with more idiomatic operator notation)
test.list = test.list :+ foo
// or (using syntactic sugar)
test.list :+= foo
于 2012-08-07T22:28:13.587 に答える