Trait中的Scala对象

时间:2011-05-04 11:17:51

标签: scala scope singleton

在Scala中,对象是单身......所以如果我做:

trait SimpleTrait {

  def setString(s: String): Unit = {
    InnerTraitObject setString s
  }

  def getString(): String = {
    return InnerTraitObject getString
  }

  object InnerTraitObject {
    var str: String = ""

    def setString(s: String): Unit = {
      str = s
    }

    def getString(): String = {
      return str
    }
  }
}

然后

class SimpleClass extends SimpleTrait{
 /// empty impl
}

object App {

  def main(args: Array[String]): Unit = {

    val a = new SimpleClass();
    val b = new SimpleClass();

    a.setString("a");

    println("A value is " + a.getString());
    println("B value is " + b.getString());
  }
}

我想看看

A value is a
B value is a

但我得到了

A value is a
B value is

我的问题是: 如果对象是单身,那么为什么如果我将它放入Trait然后它的行为就像普通对象一样?

1 个答案:

答案 0 :(得分:20)

它不是一个全局单例,它是一个引用特征实例的单例(可以有多个实例)。它取决于您定义单例的位置:如果在包中定义,那么它是关于包的单例,包也是单例,因此对象是单例。你看,它取决于你将一些东西定义为单身的上下文。如果上下文是单例,那么也是定义的对象。