我需要有关此代码的帮助。
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() )
值未被添加到列表中。有人能让我知道我做错了什么。它不起作用。有没有办法让print语句有效?
答案 0 :(得分:2)
您需要使用空Vector而不是null
初始化测试。在Scala中执行此操作的方法是使用Vector
对象中的工厂方法,并让类型推断完成其工作。例如:
var list = Vector.empty[MyType]
当你练习这样做时,你会发现自己更专注于创建数据而不是声明它的类型,在这种情况下,它会在它发生之前解决这个错误。 / p>
接下来的操作
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
答案 1 :(得分: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
扩展应用程序仅向对象添加主方法,包含对象中的所有代码。