-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

您需要使用空 Vector 而不是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 回答
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

扩展 App 只是给一个对象增加一个 main 方法,包含对象中的所有代码。

于 2012-08-08T06:22:29.743 回答