如何启动对象

时间:2012-08-07 22:15:16

标签: scala parameter-passing

我需要有关此代码的帮助。

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语句有效?

2 个答案:

答案 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

扩展应用程序仅向对象添加主方法,包含对象中的所有代码。