Модификация стека Scala для Function0 - PullRequest
2 голосов
/ 27 октября 2019

Я только что столкнулся с очень странным поведением в модификациях стека Scala.

Давайте посмотрим пример:

class Base extends Function0[Unit] {
  override def apply(): Unit = println("base")
}

trait Modification extends Function0[Unit] {
  abstract override def apply(): Unit = { print("modified "); super.apply() }
}

val a = new Base with Modification
a.apply()

Я ожидаю, что результат будет похож на modified base. Вместо этого я получил modified modified modified..., в результате чего StackOverflowError

Что интересно, это происходит только с Function0 [Unit]. Функция [String] работает нормально:

class Base extends Function0[String] {
  override def apply(): String = "base"
}

trait Modification extends Function0[String] {
  abstract override def apply(): String = "modified " + super.apply()
}

val a = new Base with Modification
a.apply()

Вывод:

defined class Base
defined trait Modification
a: Base with Modification = <function0>
res0: String = modified base

Может кто-нибудь объяснить, пожалуйста, такое поведение?

1 Ответ

3 голосов
/ 27 октября 2019

Выглядит как ошибка, потому что с пользовательским Function0 все работает как положено

trait Function0[+R] {
  def apply(): R
}

class Base extends Function0[Unit] {
  override def apply(): Unit = println("base")
}

trait Modification extends Function0[Unit] {
  abstract override def apply(): Unit = { print("modified "); super.apply() }
}

val a = new Base with Modification

a.apply() // modified base

Об ошибках следует сообщать здесь: https://github.com/scala/bug/issues

...