Trait中的Scala对象

Koz*_*łek 11 singleton scope scala

在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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后

class SimpleClass extends SimpleTrait{
 /// empty impl
}
Run Code Online (Sandbox Code Playgroud)

和:

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

我想看看

A value is a
B value is a
Run Code Online (Sandbox Code Playgroud)

但我得到了

A value is a
B value is
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果对象是单身,那么为什么如果我把它放入Trait然后它表现得像普通对象?

Pet*_*itz 20

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

  • 或者更正式地说:它是定义范围内的单身人士 (15认同)