Объект 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
    }
  }
}

потом

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, он будет вести себя как обычный объект?


person Koziołek    schedule 04.05.2011    source источник
comment
Если вы переместите InnerTraitObject за пределы SimpleTrait, вы получите желаемое поведение. Но это не ответ на ваш вопрос.   -  person michael.kebe    schedule 04.05.2011
comment
Я знаю, потому что теперь я использую хак.   -  person Koziołek    schedule 04.05.2011


Ответы (1)


Это не глобальный синглтон, это синглтон, относящийся к экземпляру признака (у которого может быть несколько экземпляров). Это зависит от того, где вы определяете синглтон: если он определен в пакете, то он является синглтоном относительно пакета, и пакет тоже является синглтоном, поэтому объект является синглтоном. Видите ли, это зависит от контекста, в котором вы определяете что-то как синглтон. Если контекст одноэлементный, то и определенный объект тоже.

person Peter Schmitz    schedule 04.05.2011
comment
Или более формально: это синглтон в определяющей области - person Kevin Wright; 04.05.2011